面向对象的三大特性:封装—保护类中的属性不被外部直接访问到;继承—扩展类的属性和功能;那么多态性呢?
多态性是Java中最强悍的地方,那么有一个简单但是又需要好好推敲的疑问:什么是多态?什么是对象的多态?
1,什么是多态?
,按我的理解,什么是多态,字面意思咯,多种状态。
,面向对象的多态特性有两种提现方式:1,方法的重载与覆写(有的人说这不算多态,然而,我感觉算,因为他们也满足了多种状态的要求);2,对象的多态性;
重载—根据方法参数个数和参数类型的不同完成的功能也不同;覆写—–子类根据需求覆写父类中的方法;
1-0:对象的多态性
1-1相上转型:
使用父类对象接收子类实例(自动完成)。子类对象为父类对象实例化。
发生了向上转型,那么在子类中那些独有的属性和方法,就不能被这个转型了的对象所看到了。
class A{ // 定义类A
public void fun1(){ // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ; // 调用fun1()方法
}
};
class B extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){ //子类重新定义的自己独有的方法
System.out.println("B --> public void fun3(){}") ;
}
};
public class PolDemo01{
public static void main(String asrgs[]){
B b = new B() ; // 实例化子类对象
A a = b ; // 向上转型关系
a.fun1() ; // 此方法被子类覆写过
a.fun3() ;
}
};
这里a.fun3();这句代码就会报错,因为a已经是从b向上转型过来的了,它看不到b独有的方法了,能看到的都是b中从a继承而来和覆写而来的方法和属性。
向上转型中的注意点
但是,注意,发生了向上转型,是父类对象,然后去调用那些父类中的方法,会发现,被调用的依然是子类中覆写过的方法,如果没有覆写过这些方法,则才会调用父类中的方法,因为发生向上转型了,一定程度上说,他还是子类实例,在我的理解里,是剥除了子类独有特性的子类。(可以形象的这么理解,这个子类对象是个私生子,是婢女所生的非正室所生的孩子,没有给予他开疆拓土成为一方诸侯的能力,仅仅是拥有其父辈积攒的余荫以及和父辈紧密相关的权力,只有正室所生的孩子才拥有父辈带来的光辉以及在父辈基础上继续开疆拓土的权力)调用子类独有的方法和属性就会报错了,因为他的这些方法属性,已经被剥除了,他看不到了,所有报错了。
public class PolDemo01{
public static void main(String asrgs[]){
B b = new B() ; // 实例化子类对象
A a = b ; // 向上转型关系
a.fun1() ; // 此方法被子类覆写过
a.fun2() ;
}
};
<