多态概述:
- 代码当中提现多态性,其实就是一句话:父类引用指向子类对象。
多态的格式与使用
- 代码:
父类名称 对象名 =new 子类名称();
- 定义父类:
public class Fu{
public void method(){
System.out.println(“父类方法”);
}
public void methodFu(){
System.out.println(“父类特有方法”);
} }
- 定义子类:
public class Zi extends Fu{
@Override
public void method(){
System.out.println(“子类方法”);
} }
- 使用多态的写法:
public class Demo01Multi{
public static void main(String[] args){
//使用多态的写法
//左侧父类的引用,指向了右侧子类的对象。
Fu obj=new Zi();
obj.method(); //子类方法。
obj.methodFu(); //父类特有方法。
} }
- 或者:
接口名称 对象名 =new 实现类名称();
多态中成员变量的使用特点
-
访问成员变量的两种方式:
-
直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
-
间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
-
父类:
public class Fu /extends Object/{
int num=10;
public void showNum(){
System.out.println(num);
} }
- 子类:
ublic class Zi extends Fu{
int num=20;
int age=16;
@Override
public void showNum(){
System.out.println(num);
} } main:
public class Demo01MultiField{
public static void main(String[] args){
//使用多态的写法,父类引用指向子类对象
Fu obj =new Zi();
//看等号左边是谁,优先用谁,没有则向上找。
System.out.println(obj.num); //优先用父 10
//错误写法! // System.out.println(obj.age);
System.out.println("==============");
//看该方法属于谁,优先用谁,没有则向上找
//子类没有覆盖重写,就是父
//子类如果覆盖重写,就是子
//如果子类不覆盖重写(就是上面的子类的showNum()不写)
obj.showNum(); //子类没有覆盖重写,就是父:10
//如果子类覆盖重写(就是上面的子类的加上showNum()方法)
obj.showNum(); //子类覆盖重写,就是子:20
} }
多态中成员方法的使用特点
-
在多态的代码当中,成员方法的访问规则是:
-
看new的是谁,就优先用谁,没有则向上找。
-
口诀:编译看左边,运行看右边。
-
对比一下:
-
成员变量:编译看左边,运行还看左边
-
成员方法:编译看左边,运行看右边
-
定义父类:
public class Fu{
public void method(){
System.out.println(“父类方法”);
}
public void methodFu(){
System.out.println(“父类特有方法”);
} }
- 定义子类:
public class Zi extends Fu{
@Override
public void method(){
System.out.println(“子类方法”);
} }
- 使用多态的写法:
public class Demo01Multi{
public static void main(String[] args){
//使用多态的写法
//左侧父类的引用,指向了右侧子类的对象。
Fu obj=new Zi();
//父子都有,优先用子类方法
obj.method(); //子类方法
//子类没有,父类有
obj.methodFu(); //父类特有方法。
//编译看左边,左边是Fu,Fu当中没有methodZi方法,所以编译报错。
//obj.methodZi(); 错误写法
}
多态的好处:
- 提高的代码的维护性(继承保证,即可以通过改写父类属性与方法同义改写子类共有属性与方法)
- 提高了代码的扩展性(由多态保证,即父类为形式参数,接收任意子类对象,在开发的时候用多态,扩展性强)
多态中调用子类特有方法:
- 父类强转转换为子类,调用特有方法
详情查看另一个笔记(引用类型转换)
-
好处:当已经有定义好一个子类时,我们常用强转方法,它有以下优点
-
父类强转成子类后,可多次调用子类的特有方法,
-
可灵活调用子类各种特有方法()
- 匿名内部类
- 匿名内部类,对象定义特有方法,并对其调用
Animal a=new Animal(){
public void catchMouse(){
System.out.println(“catchmouse”);
} }; //相当于创建一个子类对象,并让a指向它 a.catmouse(); //此行会报错
父类a不能直接调用子类的特有方法。
- 解决:不让他指向父类变量,直接调用方法
new Animal(){ public void catchMouse(){
System.out.println(“catch Mouse”); }
}.catchMouse(); //输出catch Mouse
-
当我们没有定义好一个子类时,且也不想去定义这个子类的时候,只想临时用一下,我们可以采用匿名内部类对象方法,它有以下优劣点:
-
省去了定义子类的过程
-
较适合于临时,突发性, 想调用一个特有方法时。
-
它想多次调用一个特有方法时,没有1方法方便