目录
多态:
1、多态是方法的多态,属性没有多态
2、父类和子类,有类型
3、多态存在条件:继承关系,方法需要重写,父类的引用指向子类对象!
父类Person
public class Person {
public void run() {
}
}
子类Student
public class Student extends Person{
//重写 非静态方法
@Override
public void run() {
System.out.println("son");
}
public void eat() {
System.out.println("eat");
}
}
不能重写的情况:
1、static 方法,属于类,它不属于实例
2、final 常量
3、private 方法
测试类
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
// new Student();
// new Person();
//可以指向的引用类型就不确定了:父类指向了子类
//Student 能调用的方法是自己的或者继承父类的方法
Student s1 = new Student();
//Person 父类型,可以指向子类,但是不能调用之类独有的方法
Person s2 = new Student();
Object s3 = new Student();
s2.run(); //子类重写,执行子类方法 son
s1.run();
//s2.eat();该语句执行错误,因为s2指向父类,而父类没有eat函数
//如果子类有重写(静态方法)eat函数 执行子类
//如果子类没有重写(非静态方法)eat函数 执行父类
((Student) s2).eat(); //强制转化,Person转Student
s1.eat();
}
}
//输出
//son
//son
//eat
//eat
instanceof (引用类型转换)
(1)先有继承关系,再有instanceof的使用。
(2)当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的
同一分支或存在继承关系,否则编译器会报错。
//System.out.println(x instanceof y); 能不能编译通过!如果x和y有关系,就可以编译通过。
父类Person ,子类 Student,子类Teacher
下面是测试类代码:
public class Application {
public static void main(String[] args) {
//System.out.println(x instanceof y); 能不能编译通过!
//Object 相当于Person的爸爸类
//Object > Person > Teacher
//Object > Person > Student
Object object = new Student();
System.out.println(object instanceof Student); //True 这个是true是因为Object指向Student子类
System.out.println(object instanceof Person); //True
System.out.println(object instanceof Object); //True
System.out.println(object instanceof Teacher); //false
System.out.println(object instanceof String); //false
System.out.println("======================");
Person person = new Student();
System.out.println(person instanceof Student); //True
System.out.println(person instanceof Person); //True
System.out.println(person instanceof Object); //True
System.out.println(person instanceof Teacher); //false
// System.out.println(person instanceof String); //编译不通过
System.out.println("======================");
Student student = new Student();
System.out.println(student instanceof Student); //True
System.out.println(student instanceof Person); //True
System.out.println(student instanceof Object); //True
//System.out.println(student instanceof Teacher); //编译不通过
//System.out.println(student instanceof String); //编译不通过
}
}
类型转换
注意:类型转换 高转低要强制转化,低转高不需要,强制转化可能会丢失方法
Person类只有run方法,Student类中只有go方法,下面是测试类代码:
public class Application {
public static void main(String[] args) {
//高 --> 低 Person 类
Person student = new Student();
//把Person 类 强制转化成 Student 类,并把新的Student类命名为students,不转化不能使用Student类中的go方法
Student students =(Student) student;
students.go();
}
}
强制转化部分或者用一行代码解决:
((Student) student) .go();