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

2021/7/14 1:05:51

本文主要是介绍11.java中面向对象--多态性(4)(附讲解与练习),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

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中面向对象--多态性(4)(附讲解与练习)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程