Java特性——继承

    Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以分隔符先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
    类和类之间的继承关系可以用UML符号表示,其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。
JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和操作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
    继承避免了对一般类和特殊类之间共同特征进行的重复描述。同时,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。
    (摘自百度百科)

具体应用:


package leantest02;

public class Java特性_继承 {

    public static void main(String[] args) {
        //创建A的实例
        A a=new A();
        //访问A的成员变量
        a.a=10;
        //对于static修饰的不用实例化对象,它是属于这个类的
        A.c=30;//此后A的成员c将一直保持该值
        //对于private修饰的,不能访问,因为你它只能在A类(本类中访问)
        //调用A的成员方法
        a.method();//输出a=10 b=2 c=30

        //B继承A类
        //创建B的实例
        B b=new B();
        //访问B的成员变量
        System.out.println(b.a);//输出4(B类的成员变量a覆盖了A的成员变量a)
        //访问A的成员变量
        System.out.println(B.c);//输出3 (子类B访问到了父类A的成员c)
        //访问B的成员方法
        b.method2();//输出hello (如果于父类中的成员方法同名则会覆盖父类方法)
        //访问A的成员方法
        b.method();//输出a=1   b=2  c=30
        //还可以这样写,定义一个A类型的c,它指向B对象实例
        A c=new B();//这样实例c只能访问父类中存在的子类已经重写过的方法,否则只能访问父类的方法
        c.method();
        System.out.println(c.a);//访问到的是父类的成员a
        System.out.println(c.c);//访问到的是父类的成员c

    }

}
class A{
    public int a=1;
    private int b=2;
    public static int c=3;
    public void method(){
        System.out.println("a="+a);
        System.out.println("b="+b);
        System.out.println("c="+c);
    }
}
class B extends A{
    public int a=4;
    private int b=5;
    public static int d=6;
    public int e=super.a;
    public void method2(){
        System.out.println("hello");
    }
}

将生成的 .class文件进行反编译
A.java

这里写图片描述

可以看到,在写的时候并没有写class A的构造方法,但是反编译后却存在构造方法,原因是在写代码时如果没有写构造方法,系统会自动生成一个空参数的构造方法,比如图中的A()方法。
同样子类B也是这样:

这里写图片描述
系统自动生成了默认的构造方法
注:子类会自动调用父类的构造器,即在子类中会隐式存在super()方法
另外根据修饰符的不同,父类成员对子类的可见性也不同
参见:java权限修饰符

原文地址:https://www.cnblogs.com/cnsec/p/13286837.html