概念:对象的多种形态
1.引用多态父类的引用可以指向本类的对象
父类的引用可以指向子类的对象2.方法多态
父类型的引用可以指向子类型的对象
Person person = new Student();
Student student = new Student();
思考:两个不同类型的引用person和student的区别在哪里?
student01可以访问对象中所有的非私有的成员
person01只能访问对象中从父类继承下来的非私有成员
向上类型转换(隐式/自动类型转换),是小类型到大类型的转换
向下类型转换(强制类型转换),是大类型到小类型
instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
自动类型转换
子类型的引用自动转换为父类型引用
Student student = new Student();
Person person = student;
强制类型转换
父类型的引用强制转换为子类型引用
Person person = new Student();
Student student = (Student)person;
思考:下面强转有问题吗?
Person person = new Student();
Teacher teacher = (Teacher)person;
有问题,会抛出类型转换异常
功能:instanceof可以检测引用所指向的对象的类型
//检测person引用所指向的对象类型是否为Teacher
boolean is01 = person instanceof Teacher;
System.out.println("is01 = " + is01);
//
boolean is02 = person instanceof Student;
System.out.println("is02 = " + is02);
程序输出结果 is01 = false, is02 = true
实例:
package com;public class Circle extends Graph{public Circle(double a) {
super(a);
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return Math.PI*a*a;
}
@Override
public double getPerimeter() {
// TODO Auto-generated method stub
return 2*Math.PI*a;
}
public void myCircle() {
System.out.println("我是圆形");
}
}package com;public class Rectangle extends Graph{
private double b;public Rectangle(double a,double b) {
super(a);
this.b = b;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return a*b;
}
@Override
public double getPerimeter() {
// TODO Auto-generated method stub
return (a+b)*2;
}
public void myRectangle() {
System.out.println("我是矩形");
}
}package com;public class Test {/*
* Java虚拟机执行代码是,会把类文件加载到虚拟机生成类文件(类中有哪些属性和行为)
* 调用方法时,更具分配的空间调用?还是根据引用调用?
* 调用方法是看类对象,不看空间
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
Graph graph = new Circle(1);
graph.getArea();
}}
原文:https://www.cnblogs.com/windsand/p/11337204.html