面向对象三大特性——多态
概念
同一个方法,根据发送对象的不同而采取多种不同的行为方式
父类引用变量可以指向子类对象
父类类型 变量名=new 子类类型();
- 对象属性
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
- 对象方法
Fu f1=new Zi();
f1.show());
//show()是父类独有的方法,可以直接调用
//show()是父类和子类都有的方法,这里调用的是子类中重写的方法
(zi)f1.show();
//show()是子类中独有的方法,需要进行对象类型强制转换才可以调用
Instanceof
判断两个类是否有继承关系
(Object) instanceof (Class);
- 当对象是右边类或子类所创建对象时,返回true;否则,返回false。
- instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误
类型转换
1.子类可以直接转换为父类,但是可能会丢失部分自己本身的方法(重写方法)
2.父类转换为子类,强制转换
//(子类类型)父类对象-->实现强制转换
//(子类类型)父类对象.子类方法-->可以实现调用子类独有方法
示例
多态
main
package course;
import course.oopLesson.Polymorphism.Computer;
import course.oopLesson.Polymorphism.Dell;
public class Application {
public static void main(String[] args) {
Computer object = new Computer();//父类对象
Dell object1 = new Dell();//子类对象
Computer object2 = new Dell();//父类引用变量指向子类对象
//对象属性——只和等号左边的类有关
System.out.println(object.name);//输出父类属性
System.out.println(object1.name);//输出子类属性
System.out.println(object2.name);//输出父类属性(子类对象)
System.out.println("============================================");
//对象方法
//共有的方法
object.print();//调用父类方法
object1.print();//调用子类方法
object2.print();//调用子类重写方法
System.out.println("============================================");
//父类独有方法
//均可以直接调用(引用变量为父类类型)
object.printNum();
object1.printNum();
object2.printNum();
System.out.println("============================================");
//子类独有方法
//object父类对象不可以调用子类对象独有方法
object1.printModel();//子类对象可以直接调用自身独有方法
((Dell)object2).printModel();//父类引用变量指向子类对象需要先进行强制类型转换才可以调用子类独有方法
}
}
父类Computer
package course.oopLesson.Polymorphism;
//父类
public class Computer {
//属性
public String name = "电脑";
//共有方法
public void print(){
System.out.println(name);
}
//独有方法
public void printNum(){
System.out.println("100");
}
}
子类Dell
package course.oopLesson.Polymorphism;
//子类
public class Dell extends Computer{
//属性
public String name = "DELL";
//重写方法
@Override
public void print() {
System.out.println(name);
}
//独有方法
public void printModel(){
System.out.println("灵越");
}
}
Instanceof
继承树
代码
package course;
import course.oopLesson.Instanceof.Daughter;
import course.oopLesson.Instanceof.Father;
import course.oopLesson.Instanceof.Son;
public class Application {
public static void main(String[] args) {
Object son1 = new Son();
System.out.println(son1 instanceof Object);
System.out.println(son1 instanceof Father);
System.out.println(son1 instanceof Son);
System.out.println(son1 instanceof Daughter);
System.out.println(son1 instanceof String);
System.out.println("========================================");
//
Object father1 = new Father();
System.out.println(father1 instanceof Object);
System.out.println(father1 instanceof Father);
System.out.println(father1 instanceof Son);
System.out.println(father1 instanceof Daughter);
System.out.println(father1 instanceof String);
System.out.println("========================================");
//
Son son2 = new Son();
System.out.println(son2 instanceof Object);
System.out.println(son2 instanceof Father);
System.out.println(son2 instanceof Son);
// System.out.println(son2 instanceof Daughter);//不在同一个继承树内
// System.out.println(son2 instanceof String);//不在同一个继承树内
System.out.println("========================================");
//
Father father2 = new Father();
System.out.println(father1 instanceof Object);
System.out.println(father1 instanceof Father);
System.out.println(father1 instanceof Son);
System.out.println(father1 instanceof Daughter);
System.out.println(father1 instanceof String);
System.out.println("========================================");
}
}