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)(附讲解与练习)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南
- 2024-11-16MyBatis资料详解:新手入门与初级实战指南
- 2024-11-16MyBatisPlus资料:初学者入门指南与实用教程
- 2024-11-16MybatisPlus资料详解:初学者入门指南
- 2024-11-16MyBatisX资料:新手入门与初级教程
- 2024-11-16RESTful接口资料详解:新手入门指南
- 2024-11-16RESTful接口资料详解:新手入门教程
- 2024-11-16Spring Boot资料:新手入门与初级教程
- 2024-11-16Springboot资料:新手入门与初级教程