java多态
多态的概念
多态字面意思是多种形式, 它意味着父类型的变量可以引用子类型的对象;
举个通俗的例子:
人是一个父类,男生和女生是它的子类, 男生和女生有着不同的喜好,喜欢做的是并不一样,这就是多态;
多态的情况下:定义的引用变量所指向的具体类型和引用变量发出的方法调用在编程时并不确定,只有在程序运行时才确定。
优点:不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上。
多态的条件
- 继承:必须有父类子类的继承关系
- 重写:子类要对父类的一些方法进行重写 (再调用方法时,调用的是子类重写的方法)
- 向上转型:多态中需要将子类对象的引用赋给父类对象,使得子类引用能够调用父类和子类的方法
定义格式:父类类型 变量名=new 子类类型();
动态绑定
Father fa = new Son();
System.out.println(fa.show());//这里会调用子类的show方法 因为子类重写了show方法 多态调用的是子类方法
class People{
public void print(){
System.out.println("Hello people!");
print1();
}
public void print1(){
System.out.println("Hello people!");
}
}
class Man extends People{
public void print(String name){ //重载会调用父类原方法
System.out.println("Hello man!");
print1();
}
public void print1(){ //重写会调用子类重写的方法
System.out.println("Hello man!");
}
}
public class main{
public static void main(String[] args)
{
People a =new Man();
a.print();
}
}
输出结果:
对象转换和instanceof关键字
一个对象的引用可以类型转换为另一个对象的引用,这称为对象转换
print(new Student());
//将一个Student对象赋值给一个People类型变量
//其等价于
People now = new Student();
print(now);
//这是隐式转换
//因为Student的实例也是People的实例
//而反过来 Student st = now 就会发生编译错误 因为People的实例不一定是Student的实例
//这时就要显示转换
Student st = (Student) now;//显示转换语法类似于此
为什么要进行类型转换:
因为父类对象不能直接调用子类方法 当申明一个父类变量后要将此变量进行子类的方法操作 就要类型转换了
类型转换的应用性:
进行通用程序设计时 一个好的做法就是把变量定义为父类型 这样它就可以接收任何类型的对象
instanceof是java中的关键字 用于确保在类型转换之前一个对象是另一个对象的实例
例子:
class Fruit{
String name;
int color;
int shape;
public Fruit(){
color = 0;
shape = 0;
name = "apple";
}
public int getShape(){
return shape;
}
}
class Circle{
int Diameter;
public Circle(){
Diameter = 0;
}
public int getDiameter(){
return Diameter;
}
}
public class Demo {
public static void main(String[] args) {
Object object1 = new Fruit();
Object object2 = new Circle();
displayObject(object1);
displayObject(object2);
}
public static void displayObject(Object object) {
if (object instanceof Fruit) {
System.out.println("The Fruit shape is " +
((Fruit)object).getShape());
}
else if(object instanceof Circle) {
System.out.println("The circle diameter is " +
((Circle)object).getDiameter());
}
}
}
运行结果:
参考博客:https://blog.csdn.net/m0_56107268/article/details/121033044
https://blog.csdn.net/qq_41679818/article/details/90523285