java多态
多态
即同一方法可以根据发送对象的不同而采取多种不同的行为方式
注意:
- 多态是方法的多态,属性没有多态
- 父类和子类有联系(ClassCastException类型转换异常)
- 多态存在条件:
- 继承关系
- 方法重写
- 父类引用指向子类对象 Father f1=new Son();
若方法是static、final、private修饰的则不能被重写
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Person();
//new Student();
//可以指向的引用类型是不确定的
Student s1= new Student();
Person s2 = new Student(); //父类的引用指向子类
Object s3=new Student();
}
}
一个对象实际类型(右边)是确定的但引用类型(左边)是不确定的
package com.yuanyu.Oop;
public class Person {
public void run(){
System.out.println("Run");
}
}
package com.yuanyu.Oop;
public class Student extends Person {
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Person();
//new Student();
//可以指向的引用类型是不确定的
Student s1= new Student();
Person s2 = new Student(); //父类的引用指向子类
Object s3=new Student();
s2.run(); //Run
}
}
子类继承了父类的全部方法,因此可以输出Run
在子类中进行方法的重写
package com.yuanyu.Oop;
public class Student extends Person {
@Override
public void run() {
System.out.println("Son");
}
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Person();
//new Student();
//可以指向的引用类型是不确定的
Student s1= new Student();
Person s2 = new Student(); //父类的引用指向子类
Object s3=new Student();
s1.run(); //Son
s2.run(); //Son
}
}
子类一旦重写父类的方法,执行的是子类方法
在子类中添加新的方法
package com.yuanyu.Oop;
public class Student extends Person {
@Override
public void run() {
System.out.println("Son");
}
public void eat(){
System.out.println("eat");
}
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Person();
//new Student();
//可以指向的引用类型是不确定的
Student s1= new Student();
Person s2 = new Student(); //父类的引用指向子类
Object s3=new Student();
s1.eat();
s2.eat(); //报错
((Student) s2).eat();
}
}
子类能调用的方法都是自己的或继承父类的方法
父类可以指向子类,但不能调用子类独有的方法,但是父类可以强制转换成子类调用
对象能执行哪些方法看对象左边的类型,与右边关系不大
浙公网安备 33010602011771号