Java多态

2014-11-24 09:49:18 · 作者: · 浏览: 0

多态:

父类型的引用变量指向子类型的对象,与父类型的引用变量指向父类的对象,调用名字相同的方法时(子类与父类中的方法名相同)但这个引用变量的类型都一样都是父类型的,得到的结果不一样就是多态(得到了多种状态的结果)。声明变量是编译时确定下来的,初始化变量的值是运行时确定下来的,也可以说编译时与运行时类型不一致,就可能导致多态。

·当父类引用指向子类对象后,对象.属性 或者 对象.方法 调用成员变量或方法是,这个对象是子类那么就调用子类的属性或方法。但有有一种特殊情况存在,就是静态方法(static)只能被继承不能被覆盖,当子类中出现与父类一样的static方法时,即使。

·引用变量在编译阶段只能调用编译时类型的类中的方法,运行时则执行它运行时类型所具有的方法。BaseClassploymophicBc = new SubClass(); 编译时类型是BaseClass,运行时类型是SubClass。引用变量只能调用该类型的类中包含的方法。如果运行时子类中有与父类同名的方法,则子类方法隐藏父类的方法(这就是执行运行时类型所具有的方法)。如果没有与父类同名的方法则编译时就会报错(因为编译时类型只能识别BaseClass类的方法,子类没有包含新添加的这个sub方法,所以不行,编译出错)

·通过引用变量不管在编译时还是运行时总是访问它编译时类型的类中所定义的属性。

·通过上例证明了:引用变量指向的对象是谁,那么输出的结果就是属于那个对象的。父类型的引用变量指向子类型的对象,那么输出结果就是子类对象的结果。

·多态中“对象的属性”不具备多态性。上例中子类对象调用的属性,依然是父类中的属性。

·多态中,父类中的方法在子类也要存在该方法时才能被父类型的引用子类对象去调用到,否则要报错,因为编译时确定了父类类型中的数据有哪些,这些数据也要存在子类中才能调用到子类的方法。

·两种类型强制转换:

a)向上类型转换:将Sub类型BaseClass类型,就是将上例子类型转换为父类型。系统默认完成。

b)向下类型转换:必须是在有继承和多态(父类型引用指向子类型对象)中才能将父类型转换为子类型,需要使用强制类型转换。用处:在多态中,当子类中有父类中不包含的方法时,需要引用这个个别的方法,就要用子类的对象去调用它,这时候如果是父类型的引用变量就不行(父类引用变量指向子类对象),所以要将父类型的引用变量,向下转换成子类的类型。

例子:static方法只能继承不能重写


public class Animal 
{ 
    public static void main(String[] args) 
    { 
        Cat c = new Dog(); 
        c.sing(); 
    } 
} 
 
class Cat 
{ 
    public static void sing() 
    { 
        System.out.println("cat is singing"); 
    } 
} 
 
class Dog extends Cat 
{ 
    public static void sing() 
    { 
        System.out.println("Dog is singing"); 
    } 
} 
 
  这个例子输出的结果是“Cat is singing” 

public class Animal
{
 public static void main(String[] args)
 {
  Cat c = new Dog();
  c.sing();
 }
}

class Cat
{
 public static void sing()
 {
  System.out.println("cat is singing");
 }
}

class Dog extends Cat
{
 public static void sing()
 {
  System.out.println("Dog is singing");
 }
}

这个例子输出的结果是“Cat is singing”

·类型转换的instanceof关键字

语法:见例子,通常放在if语句中判断

作用:判断这个A的数据类型能不能转换为B数据类型

注意:使用instanceof关键字判断能否类型转换时,要么是相关类型,要么是有继承,否则会报错。

例子:父类中没有的方法,继承与多态中子类不能直接调用该方法。对象属性不具有多态性。

class Animal 
{ 
    public int book = 1; 
     
    public void eat() 
    { 
        System.out.println("fu lei"); 
    } 
} 
 
public class Cat extends Animal 
{ 
    public String book = "book"; 
 
    public void eat() 
    { 
        System.out.println("zi lei"); 
    } 
 
    public void sleep() 
    { 
        System.out.println("sleep"); 
    } 
 
    public static void main(String[] args) 
    { 
        Animal a = new Animal(); 
        System.out.println(a.book); 
 
        Animal ac = new Cat(); 
        ac.eat(); 
         
        //ac.sleep();   //父类中没有这个方法,这里会报错  
 
        if (ac instanceof Cat)  //测试能否将ac类型转换为Cat类型  
        { 
            Cat okac = (Cat)ac; 
            okac.sleep();  
        } 
    } 
}