java 继承

java三大特性:封装,继承,多态。

继承:继承在本质上是特殊-一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。

     指 在现有类的基础上产生一个新的类,产生的类叫做子类,现有类叫做父类。子类会自动拥有父类的属性和方法。

   关键字 extends

  如果一个类中没有extends关键字明确标识继承另一个类,那么这个类就默认继承Object类。Object类是所有类的父类,该类中的方法 适用于所有子类,其中常用的方法有toString()方法和hashCode()方法。

注意

  (1)在java中,类值支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类。

  (2)多个类可以继承一个父类。

  (3)在java中,多层继承是允许的,即一个类的父类可以再继承其他的父类。

重写父类方法:

  在继承关系中,子类会继承父类中定义的方法,但子类也可以在父类的基础上拥有自己的特征,即对父类方法进行重写。需要注意的是,在子类中重写的方法必须与父类被重写的方法具有相同的方法名、参数列表以及返回值类型。子类重写父类方法时,不可以使用比父类中被重写方法更严格的访问权限。

1 public class Animal {
2     public void call(){
3         System.out.println("动物叫");
4     }
5     public void sleep(){
6         System.out.println("动物在睡觉");
7     }
8 }
1 public class Cow extends Animal{
2     public void call(){
3         System.out.println("牛叫...");
4     }
5 }
1 public class example {
2     public static void main(String[] args) {
3         Cow c = new Cow();
4         c.call();
5         c.sleep();
6     }
7 }
牛叫...
动物在睡觉

super关键

  当子类重写父类的方法后,子类对象不能在访问父类被重写的方法。

  Java中提供了super关键字用于访问父类的成员变量、成员方法和构造方法。

super.成员变量                            //访问成员变量
super.成员方法([参数1,参数2,参数2...])     //访问成员方法
super([参数1,参数2...])                   //访问构造方法

继承关系下的构造方法

  (1)在子类的构造方法中调用某一父类的构造方法时,调用语句必须出现在子类构造方法的第一行,可以使用super()关键字。

  (2)如果子类构造方法的声明没有明确调用父类的构造方法,则系统在执行子类构造方法时会自动调用父类的默认构造方法(即无参数构造方法)。

  (3)如果想调用一个带参数的父类构造方法,就必须用关键字super显示地编写构造方法语句。

 

继承中的初始化阶段:

  从类的结构上而言,其内部可以有如下四种形态:属性(包括类的属性和实例属性)、方法(包括类方法和实例方法),构造器和初始化块(包括类的初始化块和实例的初始化块)

用static修饰的方法。

由于类方法是属于整个类的,所以类方法的方法体中不能有与类的对象有关的内容。
即类方法体有如下限制:
    1.类方法中不能引用对象变量;
    2.类方法中不能调用类的对象方法;
    3.在类方法中不能调使用super,this关键字;
    4.类方法不能被覆盖。
当一个类创建了一个对象后,这个对象就可以调用该类的方法(对象方法)。

  1.实例方法中可以引用对象变量,也可以引用类变量;
  2.实例方法中可以调用类方法;
  3.对象方法中可以使用super,this关键字。

  对于继承中的初始化顺序,又具体分为类的初始化和对象的初始化。

  类初始化:在JVM装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间,并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义顺序决定其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

  对象初始化:在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属性和初始化块分配内存并执行初始化,然后执行父类构造其中的初始化块程序,接着才开始对子类的对象属性和初始化块执行初始化。

 1 public class Demo1 {
 2     int a = 1;
 3     {
 4         System.out.println(a);
 5     }
 6     public Demo1() {
 7         System.out.println("父类构造器");
 8     }
 9     static{
10         System.out.println("父类静态初始化块");
11     }
12     {
13         System.out.println("父类实例初始化块");
14     }
15     public void method() {
16         System.out.println("父类方法");
17     }
18 }
 1 public class Demo2 extends Demo1{
 2     int a = 2;
 3     {
 4         System.out.println(a);
 5     }
 6     public Demo2() {
 7         System.out.println("子类构造器");
 8     }
 9     static {
10         System.out.println("子类静态初始化块");
11     }
12     {
13         System.out.println("子类实例初始化块");
14     }
15     public static void main(String[] args) {
16         new Demo2().method();
17     }
18 }
父类静态初始化块
子类静态初始化块
1
父类实例初始化块
父类构造器
2
子类实例初始化块
子类构造器
父类方法

 

posted @ 2018-09-30 22:11  没有耳朵de猫  阅读(228)  评论(0编辑  收藏  举报