ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

11.java中面向对象--多态性(4)(附讲解与练习)

2021-07-13 23:01:24  阅读:182  来源: 互联网

标签:11 java String weight 多态性 radius double Circle public


面向对象特征之三:多态性

1.理解多态性:可以理解为一个事物的多种形态。
2.何为多态性:
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
3.多态的使用虚拟方法调用
有了对象的多念性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。
4.多态性的使用前提:
①类的继承关系
②方法的重写
5.对象的多态性,只适用于方法,不适用于属性(方法在子类中可以被重写)
在这里插入图片描述
在这里插入图片描述
instanceof 操作符
instanceof关键字的使用
》a instanceofA:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false
》使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
》如果a instanceofA返回true,则 a instanceofB也返回true.其中,类B是类A的父类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
子类继承父类(编译看左边,执行看右边)
若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中。
对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量。
*子父类的属性不要同名,很容易出错!

练习
建立InstanceTest 类,在类中定义方法method(Person e);
在method中:
(1)根据e的类型调用相应类的getInfo()方法。
(2)根据e的类型执行:
如果e为Person类的对象, 输出:“a person”;
如果e为Student类的对象, 输出:“a student” “a person ”
如果e为Graduate类的对象,输出:“a graduated student”
“a student” “a person”

下面展示一些 Person

package ToObject.Test4;

/**
 * @author dell
 * @version 11.0
 * @ClassnamePerson
 * @Description Do
 * @date 2021/7/13 20:35
 * @Project Java2018
 **/
public class Person {
    protected String name = "person";
    protected int age = 50;
    public String getInfo() {
        return "Name: "+ name + "\n" +"age: "+ age;
    }
}

class Student extends Person {
    protected String school = "pku";
    public String getInfo() {
        return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school;
    }
}


class Graduate extends Student{
    public String major = "IT";
    public String getInfo() {
        return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school+"\nmajor:"+major;
    }
}

下面展示一些 InstanceTest

package ToObject.Test4;

/**
 * @author dell
 * @version 11.0
 * @Classname
 * @Description Do
 * @date 2021/7/13 20:24
 * @Project Java2018
 **/
/*
建立InstanceTest 类,在类中定义方法method(Person e);
在method中:(1)根据e的类型调用相应类的getInfo()方法。(2)根据e的类型执行:
如果e为Person类的对象, 输出:“a person”;
如果e为Student类的对象, 输出:
“a student”
“a person ”
如果e为Graduate类的对象,输出:
“a graduated student”
“a student”
“a person”
 */
public class InstanceTest {
    public static void main(String[] args) {
        InstanceTest test = new InstanceTest();
        test.method(new Student());
        System.out.println("********************");
        test.method(new Graduate());

    }


    public void method(Person e){
        //虚拟方法调用
        String info = e.getInfo();
        System.out.println(info);

        //方法一
        if (e instanceof Graduate){
            System.out.println("a graduated student");
            System.out.println("a student");
            System.out.println("a person");
        }else if (e instanceof Student){
            System.out.println("a student");
            System.out.println("a person");
        }else{
            System.out.println("a person");
        }


    }
}

定义三个类,父类GeometricObject代表几何形状,子类Circle代表圆形, MyRectangle代表矩形。
定义一个测试类GeometricTest, 编写equalsArea方法测试两个对象的面积是否相等(注意方法的参数类型,利用动态绑定技术),编写displayGeometricObject方法显示对象的面积(注意方法的参数类型,利用动态绑定技术)。
下面展示一些 GeometricObject

package ToObject.Test4;

/**
 * @author dell
 * @version 11.0
 * @ClassnameGeometricObject
 * @Description Do
 * @date 2021/7/13 20:51
 * @Project Java2018
 **/
public class GeometricObject {
    protected String color;
    protected double weight;

    protected GeometricObject(String color,double weight){
        super();
        this.color = color;
        this.weight = weight;
    }


    public String getColor() {
        return color;
    }

    public double getWeight() {
        return weight;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double findArea(){
        return 0.0;
    }
}

下面展示一些 Circle extends GeometricObject

package ToObject.Test4;

/**
 * @author dell
 * @version 11.0
 * @ClassnameCircle
 * @Description Do
 * @date 2021/7/13 20:51
 * @Project Java2018
 **/
public class Circle extends GeometricObject{
    private double radius;

    public Circle(String color,double weight,double radius){
        super(color,weight);
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double findArea(){
        return Math.PI * radius * radius;
    }
}

下面展示一些 MyRectangle extends GeometricObject

package ToObject.Test4;

/**
 * @author dell
 * @version 11.0
 * @ClassnameMyRectangle
 * @Description Do
 * @date 2021/7/13 20:51
 * @Project Java2018
 **/
public class MyRectangle extends GeometricObject{
    private double width;
    private double height;

    public MyRectangle(String color,double weight,double width,double height){
        super(color,weight);
        this.width = width;
        this.height = height;
    }

    public double getHeight() {
        return height;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double findArea(){
        return width * height;
    }
}

下面展示一些 GeometricTest

package ToObject.Test4;

/**
 * @author dell
 * @version 11.0
 * @ClassnameGeometricTest
 * @Description Do
 * @date 2021/7/13 20:51
 * @Project Java2018
 **/

/*
定义一个测试类GeometricTest, 编写equalsArea方法测试两个对象的面积是否相等(注意方法的参
数类型,利用动态绑定技术),编写displayGeometricObject方法显示对象的面积(注意方法的参
数类型,利用动态绑定技术)。
 */
public class GeometricTest {
    public static void main(String[] args) {
        GeometricTest test = new GeometricTest();

        Circle c1 = new Circle("red",23,2.3);
        Circle c2 = new  Circle("red",23,2.3);
        Circle c3 = new  Circle("red",23,7.3);
        MyRectangle m1 = new MyRectangle("white",23,3.3,4.1);
        test.displayGeometricObject(c1);
        test.displayGeometricObject(c3);
        boolean isEqual =  test.equalsArea(c1,c2);
        System.out.println("面积是否相等:" + isEqual);
        boolean isEqual1 =  test.equalsArea(c1,c3);
        System.out.println("面积是否相等:" + isEqual1);
        test.displayGeometricObject(m1);
        boolean isEqual2 =  test.equalsArea(c1,m1);
        System.out.println("面积是否相等:" + isEqual2);


    }
    public void displayGeometricObject(GeometricObject g){
        double area = g.findArea();
        System.out.println("面积是:" + area);
    }

    public boolean equalsArea(GeometricObject g1,GeometricObject g2){
        return g1.findArea() == g2.findArea();
    }

}

Object类的使用
java.lang.object类
1.object类是所有Java类的根父类
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.object类
3.object类中的功能(属性、方法)就具有通用性。 属性:无
方法:equals() / tostring() / getClass() /hashcode() / clone() / finalize()
wait( ) 、 notify ( )、notifyAl1()
4. object类只声明了一个空参的构造器
面试题:
final、finally、finalize的区别?
前两个是关键字,后一个是方法,用于内存空间释放前必须要进行调用。
在这里插入图片描述
Object类的主要结果
在这里插入图片描述
面试题:==和equals()区别
一、回顾==的使用:
==:运算符
1.可以使用在基本数据类型变量和引用数据类型变量中
2.如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同);如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体。
补充:==符号使用时,须保证符号左右两边的变量类型一致。
在这里插入图片描述
二、equals()万法的使用:
1.是一个方法,而非运算符
2.只能适用于引用数据类型
5. object类中equals()的定义:
public boolean equals (object obi) {
return (this ==obi);
}

说明:0bject类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体。
4.像String、Date、File、包装类等都重写了0bject类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
在这里插入图片描述
5.通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写。
重写的原则:比较两个对象的实体内容是否相同.
在这里插入图片描述
在这里插入图片描述
object类中toString()的使用:
1.当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
2. object类中toString()的定义:
public String toString() {
return getclass().getName( ) +"@” + Integer.toHexString(hashCode());
}
3.像String、Date、File、包装类等都重写了0bject类中的toString()方法。
使得在调用对象的tostring()时,返回"实体内容"信息
4.自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容。
在这里插入图片描述
下面展示一些 GeometricObject

package ToObject.Test4.Test41;

/**
 * @author dell
 * @version 11.0
 * @ClassnameGeometricObject
 * @Description Do
 * @date 2021/7/13 21:30
 * @Project Java2018
 **/
/*
GeometricObject
protected String color
protected double weight
protected GeometricObject()
protected GeometricObject(String color, double
weight)
属性的getter和setter方法
 */
public class GeometricObject {
    protected String color;
    protected double weight;


    protected GeometricObject(){
        super();
        this.color = "white";
        this.weight = 1;
    }
    protected GeometricObject(String color, double weight){
        this.color = color;
        this.weight = weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getWeight() {
        return weight;
    }

    public String getColor() {
        return color;
    }

}

下面展示一些 Circle extends GeometricObject

package ToObject.Test4.Test41;

/**
 * @author dell
 * @version 11.0
 * @ClassnameCircle
 * @Description Do
 * @date 2021/7/13 21:31
 * @Project Java2018
 **/
/*
Circle
private double radius
public Circle()
public Circle(double radius)
public Circle(double radius,String color,double weight)
radius属性的setter和getter方法
public double findArea():计算圆的面积
public boolean equals(Object obj)
public String toString() */

public class Circle extends GeometricObject{
    private double radius;
    public Circle(){
        super();
    }
    public Circle(double radius){
        super();
        this.radius = radius;
        color = "white";
        weight = 1;
    }
    public Circle(double radius,String color,double weight){
        super(color,weight);
        this.radius = radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public double findArea(){
        return Math.PI * radius * radius;
    }

    //比较两个圆的面积是否相等
    @Override
    public boolean equals(Object obj){
        if (this == obj){
            return true;
        }
        if (obj instanceof Circle){
            //利用强转符号
            Circle c = (Circle)obj;
            return this.radius == c.radius;
        }
        return  false;
    }


    public String toString(){
        return "Circle [radius=" + radius + "]";
    }
}

下面展示一些 CircleTest

package ToObject.Test4.Test41;

/**
 * @author dell
 * @version 11.0
 * @ClassnameCircleTest
 * @Description Do
 * @date 2021/7/13 21:31
 * @Project Java2018
 **/
/*
    初始化对象的color属性为“white”, weight属性为1.0, radius根据参数构造器确定
    重写equals方法,比较两个圆的半径是否相等,如相等,返回true。
    重写toString方法,输出圆的半径。
写一个测试类,创建两个Circle对象,判断其颜色是否相等;利用equals方法判断其半径是否相等;利用
toString()方法输出其半径。
 */

public class CircleTest {
    public static void main(String[] args) {
        Circle c1 = new Circle(2.3);
        Circle c2 = new Circle(2.3);
        Circle c3 = new Circle(1.3,new String("white"),1);
        Circle c4 = new Circle(3.3,"red",1);

        //String类型的引用在equals()的时候已经经过转换。

        //引用数据类型相等
        System.out.println("颜色是否相同:" + c1.getColor().equals(c2.getColor()));
        System.out.println("颜色是否相同:" + c1.getColor().equals(c4.getColor()));

        //基本数据类型相等
        System.out.println("半径是否相同:" + c1.equals(c3));
        System.out.println(c1);
        System.out.println(c1.toString());
    }



}

包装类的使用

java中的JUnit单元测试
步骤:
1.选中当前工程–右键选择: build path - add libraries - JUnit 4 -下一步
2.创建Java类,进行单元测试。
此时的Java类要求:此类是public的 ②此类提供公共的无参的构造器
3.此类中声明单元测试方法。
此时的单元测试方法:方法的权限是public,没有返回值,没有形参。
4.此单元测试方法上需要声明注解:@Test,并在单元测试类中导入: import org.junit.Test;
5.声明好单元测试方法以后,就可以在方法体内测试相关的代码。
6.写完代码以后,左键双击单元测试方法名,右键: run as - JUnit Test

说明:
1.如果执行结果没有任何异常:绿条
2.如果执行结果出现异常:红条
在这里插入图片描述
 针对八种基本数据类型定义相应的引用类型—包装类(封装类)
 有了类的特点,就可以调用类中的方法, Java才是真正的面向对象
在这里插入图片描述
总结:基本类型、包装类与String类间的转换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
**练习:**利用Vector代替数组处理:从键盘读入学生成绩(以负数代表输入结束),找出最高分,并输出学生成绩等级。
提示:数组一旦创建,长度就固定不变,所以在创建数组前就需要知道它的长度。而向量类java.util.Vector可以根据需要动态伸缩。
创建Vector对象: Vector v=new Vector();
给向量添加元素: v.addElement(Object obj); //obj必须是对象
取出向量中的元素: Object obj=v.elementAt(0);
注意第一个元素的下标是0,返回值是Object类型的。
计算向量的长度: v.size();
若与最高分相差10分内: A等; 20分内: B等;30分内: C等;其它: D等
下面展示一些 ScoreTest

package ToObject.Test4;

import java.util.Scanner;
import java.util.Vector;

/**
 * @author dell
 * @version 11.0
 * @ClassnameScoreTest
 * @Description Do
 * @date 2021/7/13 22:03
 * @Project Java2018
 **/
/*
利用Vector代替数组处理:从键盘读入学生成绩(以负数代表输入结束),找出
最高分,并输出学生成绩等级。
提示:数组一旦创建,长度就固定不变,所以在创建数组前就需要知道它的
长度。而向量类java.util.Vector可以根据需要动态伸缩。
创建Vector对象: Vector v=new Vector();
给向量添加元素: v.addElement(Object obj); //obj必须是对象
取出向量中的元素: Object obj=v.elementAt(0);
注意第一个元素的下标是0,返回值是Object类型的。
计算向量的长度: v.size();
若与最高分相差10分内: A等; 20分内: B等;
30分内: C等;其它: D等
 */
public class ScoreTest {
    public static void main(String[] args) {
        //实例化Scanner,用于键盘获取学生
        Scanner scanner = new Scanner(System.in);
        Vector v = new Vector();

        int maxScore = 0;
        for (;;){
            System.out.println("输入学生成绩(以负数代表输入结束)");
            int score = scanner.nextInt();
            if (score < 0){
                break;
            }
            if (score > 100){
                System.out.println("输入信息有误,请重新输入!");
                continue;
            }
            //添加学生成绩, v.addElement(Object obj);

//            //jdk5.0之前
//            Integer Score = new Integer(score);
//            v.addElement(Score);

            //jdk5.0之后
            v.addElement(score);
            //获取学生的最大分数
            if (maxScore < score){
                maxScore = score;
            }


        }

        //遍历Vector,得到每个学生的等级
        char level;
        for (int i = 0;i < v.size();i++){
            Object obj = v.elementAt(i);
            //jdk5.0之前
//            Integer inScore = (Integer)obj;
//            int score = inScore.intValue();
            int score = (int)obj;

            if(maxScore - score <= 10){
                level = 'A';
            }else if(maxScore - score <= 20){
                level = 'B';
            }else if(maxScore - score <= 30){
                level = 'C';
            }else{
                level = 'D';
            }
            System.out.println("student-" + i + " score is " + score + ",level is " + level);

        }


    }
}

标签:11,java,String,weight,多态性,radius,double,Circle,public
来源: https://blog.csdn.net/Royalic/article/details/118684063

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有