Java中继承与多态

Java类的继承
继承的语法结构:
    [修饰符列表] class 子类名 extends 父类名{
        类体;
    }
子类就是当前这个类,父类就是我们要复用的那个类
java中只支持单继承;c++支持多继承
一个类如果没有显式继承其他类,则该类默认继承Object
任何一个类都有一个始祖类Object,所有类的超类。

为什么要继承?
    代码的复用,方法的重写、覆盖。

在有继承关系的两个类中:
    private(私有)可以被继承,但无法访问和覆盖,即使在子类中覆盖了父类的方法,在多态里面仍然会调用父类的方法。
    静态方法有继承无覆盖,覆盖发生在对象的成员方法中,也就是发生在堆内存中,但是静态数据都是在静态内存块中。

发生覆盖的条件:
    1 发生在有继承关系的两个类之间
    2 方法必须具有相同的方法名,返回值类型,参数列表(如果参数列表不同,系统会默认这两个重载后的不同的两个方法)
    3 重写的方法不能比被重写的方法有更低的访问权限
    4 重写的方法不能比被重写的方法抛出更宽泛的异常
    5 私有方法不能被覆盖,不调用不报错,调用就报错
    6 构造方法无法被覆盖,因为构造方法不能被继承
    7 静态方法不存在覆盖,继承是对象的继承,而不是类的继承。静态方法进入内存以后,不会再有新的内存变化,所以没有覆盖这一说。
    8 覆盖指的是成员方法,和成员变量无关。

 

public class Extends_01{
    public static void main(String[] args){
        SubClass.eat();
        SubClass sb = new SubClass();
        sb.sing("爱你一万年");
        System.out.println( SubClass.name );
    }
} 

 

public class SubClass extends SuperClass{

}

 

public class SuperClass{
    static String name = "刘德华";
    int age;

    public static void eat(){
        System.out.println( "这个是父类SuperClass的eat()方法" );
    }

    public void sing(String sname){
        System.out.println( "我喜欢唱歌,你点----这个是父类SuperClass的sing()方法" + sname );
    }
}



输出结果:
   

可以看到在SubClass类中是没有任何方法或变量的,它所有的属性都来自父类,在main调用SubClass方法,调用的是SubClass从父类继承过来的。



多态:
    多态发生在赋值时
    多态只跟成员方法有关

    在这里先说明一下动态绑定和静态绑定。
    静态绑定:
        编译时(javac的时候)就把数据赋值,叫静态绑定。把我们写的源代码编译成对应的机器码,检查语法错误,拼写检查。
        绑定:把引用数据类型直接绑定类型明确,就是把赋值运算符前后的类型指定死,并且声明说不能更改,这个时候叫静态绑定。
        这个时候的赋值是指给类对象中的成员变量赋值。

    动态绑定:
        程序运行的时候,我们程序的行为,特别是内存行为,可以按照需求改变,这种就叫动态绑定。这种改变对应到代码上就是不同的对象行为,不同的对象,对应的是不同代码,不同的代码对应又是不同的内存操作,不同的代码会有不同的名字。

        多态的定义:父类的引用指向子类的对象。
        父类的引用:一是指父类变量指向的那个内存空间
                    二也是指父类自由的类型信息表,这个表示任何对象都具备的,和继承多态无关。
        子类的对象
                    一是指子类的那个堆内存空间。
                    二也是指子类的那个类型信息表。
    多态(向上转型)就是用父类对象的类型信息表去调用子类类型信息表中和父类相同的成员方法。所谓相同,就是之前子类覆写父类方法。父类信息表中没有的成员方法,就调用不到.
    
    这里还有一个转型是向下转型,就是用子类的类型信息表代替父类的类型信息表,就可以完全的让位子类对象中所有的变量和方法。
    为了避免java.lang.ClassCastException错误,需要一个关键字instanceof判断
            if(引用 instanceof 类型名)

posted @ 2015-08-10 10:42  King_J  阅读(8944)  评论(1编辑  收藏  举报