javaSE基础-多态基础认识

经典体现多态代码语句:Fu fu = new Zi();
多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接受自己的子类对象

多态的前提
必须是类与类之间有关系,要么继承,要么实现
存在覆盖
多态的好处
多态的出现大大的提高程序的扩展性
弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员
多态中成员函数(非静态)的特点
编译时期:参阅引用型变量所属的类中是否有调用的方法,有则编译成功,否则编译失败
运行时期:参阅对象所属的类中是否有调用的方法
简单总结:Fu fu = new Zi();成员函数在多态调用时,编译看左边,运行看右边

示例代码:

abstract class Animal{
    abstract void eat();
}

class Cat extends Animal{
    public void eat(){
        System.out.println("吃鱼");
    }
    public void catchMouse(){
        System.out.println("抓老鼠");
    }
}

class Dog extends Animal{
    public void eat(){
        System.out.println("啃骨头");
    }
    public void hanjiao(){
        System.out.println("旺旺");
    }
}

class Pig extends Animal{
    public void eat(){
        System.out.println("吃食");
    }
    public void gong(){
        System.out.println("拱地");
    }
}

public class Duotai{
    public static void main(String[] args) {
        Cat cat = new Cat();
        function(cat);
        Dog dog = new Dog();
        function(dog);
        Pig pig = new Pig();
        function(pig);
        /**父类的引用指向了自己的子类对象
         * 	父类的引用也可以接受自己的子类对象
         * */
        Animal ani = new Cat(); //类型提升(向上转型)
        ani.eat();
    }
    /**多态方式*/
    public static void function(Animal ani){
    	ani.eat();
    }
    
    /**因为Animal ani = new Cat(); 所以下边的方法可以被上边的function()替代*/
//    public static void function(Cat cat){
//    	cat.eat();
//    }
//
//    public static void function(Dog dog){
//    	dog.eat();
//    }
//    
//    public static void function(Pig pig){
//    	pig.eat();
//    }
}
}

面试点:多态中,成员变量的特点
无论编译和运行,都参考左边 (引用型变量所属的类)
静态成员函数的特点:
无论编译和运行,都参考左边

package com.zy.jczyw.testcase;

class Fu{
   int num = 5;
   void method1() {
	   System.out.println("fu_method_1");
   }
   void method2() {
	   System.out.println("fu_method_2");
   }
   
   static void method4() {
	   System.out.println("fu_method_4");
   }
}

class Zi extends Fu{
	int num = 8;
	void method1() {
		System.out.println("zi_method_1");
	}
	void method3() {
		System.out.println("zi_method_3");
	}
	static void method4() {
	   System.out.println("zi_method_4");
   }
}
public class Duotai{
    public static void main(String[] args) {
    	Zi z = new Zi();
    	z.method1(); //打印 zi_method_1
    	z.method2(); //打印 fu_method_2
    	z.method3(); //打印 zi_method_3
    	
    	Fu f = new Zi();
    	f.method1(); //打印 zi_method_1  子类复写了method1()
    	f.method2(); //打印 fu_method_2
    	//没有f.method3()  因为编译时虚拟机未产生对象 new Zi(); 所以只有左边Fu类的方法 
    	
    	System.out.println(f.num); //5
    	System.out.println(z.num); //8
    	
    	f.method4(); //打印 fu_method_4
    	z.method4(); //打印 fu_method_5
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章