Java的多态
Java的多态
多态的注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常(ClassCastException)
- 存在的条件:继承关系,方法需要重写,父类引用指向子类对象。 Father f1 = new Son();
- 不能被重写
- static 方法,属于类,他不属于实例:
- final 常量:
- private 方法:
- 即同一方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向的引用类型有很多(父类,或者有关系的类)
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- instanceof :(类型转换)引用类型
package com.cnblogs;
//本类用于实现
public class Application {
public static void main(String[] args) {
//编译看左边,运行看右边
//实例化(学生是一个人) 能调用的方法都是自己重写或者继承父类的方法,子类特有的方法用不了
Person stu = new Student();
//实例化(老师是一个人)
Person tea = new Teacher();
stu.work();//上学
stu.eat();//干饭
tea.work();//教书
//父子类都有的静态方法,使用的是父类的
stu.sleep();//父类睡觉
}
}
package com.cnblogs;
/*
person类
*/
public class Person {
public void work(){
System.out.println("什么事都干");
}
public void eat(){
System.out.println("干饭");
}
public static void sleep(){
System.out.println("父类睡觉");
}
}
package com.cnblogs;
/*
student类
*/
public class Student extends Person{
@Override
public void work(){
System.out.println("上学");
}
public static void sleep(){
System.out.println("子类睡觉");
}
public void work2(){
System.out.println("写作业");
}
}
package com.cnblogs;
public class Teacher extends Person{
@Override
public void work(){
System.out.println("教书");
}
}
多态的优势:
- 多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法
- 提高了程序的可扩展性和可维护性
多态的使用:
- 成员变量: 使用的是父类的
- 成员方法: 由于存在重写现象,所以使用的是子类的
- 静态成员: 随着类的加载而加载,谁调用就返回谁的
多态下,子类如何调用自己特有的方法呢?
package com.cnblogs;
//本类用于实现
public class Application {
public static void main(String[] args) {
//实例化(学生是一个人) 子类转换为父类,可能会丢失自己的本来的一些方法!
Person obj = new Student();
//强转 stu将这个对象转换为Student类型,我们就可以用Student类型的方法了。
Student stu = (Student)obj;
//实例化(老师是一个人)
Person tea = new Teacher();
stu.work();//上学
stu.eat();//干饭
stu.work2();//写作业
//强转
((Student)obj).work2();//写作业
tea.work();//教书
}
}
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型:
- 把父类转换为子类,向下转型:强制转换
- 方便方法的调用,减少重复的代码 简洁。
instanceof :(类型转换)引用类型
package com.cnblogs;
//本类用于实现
public class Application {
public static void main(String[] args) {
//Object > Person > Student
//Object > Person > Teacher
//Object > String
Object object = new Student();
//System.out.println(X instanceof Y);能不能编译通过!
System.out.println(object instanceof Student);//true
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);//编译错误
}
}