关于Java中的继承,包括重写构造器访问权限构造过程等知识总结

Posted Lee_Sung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java中的继承,包括重写构造器访问权限构造过程等知识总结相关的知识,希望对你有一定的参考价值。

关于Java中的继承,包括重写、构造器、访问权限、构造过程等知识总结,附重载相关知识

1、继承的概念

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。继承所描述的是“is-a”的关系,如果有两个对象A和B,若可以描述为“A是B”,则可以表示A继承B,其中B是被继承者称之为父类或者超类,A是继承者称之为子类或者派生类。

2、继承的规则

  • 子类拥有父类非private的属性和方法。
  • 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法(重写)
  • 父类的构造器,只能够被调用,而不能被继承。(父类有默认构造器,则自动隐式调用,无默认构造器需显示调用,且是在子类构造器的第一行)

3、构造器

父类的构造器,只能够被调用,而不能被继承。 调用父类的构造方法我们使用super()即可。

类的初始化过程:

首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化。

然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化。

其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法

最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法

即,构建过程是由父类向子类一级一级完成的。需要注意的是:

在构建过程中,子类会默认、隐式调用父类的默认构造器,如果父类没有默认构造器,子类必须显示调用父类构造器(super()方法),且必须在子类自己构造器的第一行代码

Eg.

class C 
  C()
    System.out.print("C");
  


class A 
  C c = new C();
  A()
    this("A");
    System.out.print("A");
  
  A(String s)
    System.out.print(s);
  


class Test extends A 
  Test()
    super("B");
    System.out.print("B");
  
  public static void main(String[] args)
    new Test();
  


//运行结果: CBB

4、public、protected、default、private权限

在继承中,尽管可以使用protected访问修饰符来限制父类属性和方法的访问权限,但是最好的方式还是将属性保持为private(我们应当一致保留更改底层实现),通过protected方法来控制类的继承者的访问权限。

总结:

同一个类同一个包不同包的子类不同包的非子类
Private
Default
Protected
Public

5、向上转型

父类引用指向子类对象,通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。即“is-a”的关系。将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。这就是为什么编译器在“未曾明确表示转型”活“未曾指定特殊标记”的情况下,仍然允许向上转型的原因。

  • 父类引用指向子类对象,而子类引用不能指向父类对象。
  • 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。如:Father f1 = new Son();
  • 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;其中f1前面的(Son)必须加上,进行强制转换。

6、重写(override)

  • 1、重写方法不能比被重写方法有更严格的访问级别
  • 2、参数列表必须与被重写方法相同
  • 3、返回类型必须与被重写方法相同
  • 4、重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。可以抛出更少、更有限异常或者不抛出异常。
  • 5、不能重写标识final的方法。
  • 6、一个方法不能被继承(父类的private方法,Java中把private方法默认final的),则不能重写。(带private 的,就算是“重写”,也指相当于在子类添加了一个新的方法而已,与父类的方法没有半毛钱关系)。

Eg.

public class Test 
    public static void main(String[] args)
        Horse h = new Horse();  
        h.eat();    //Horse类中的eat方法,只是一个全新的方法,不是重写,也不是重载

        Animal a = new Horse();
        a.eat();    //编译错误————多态只看父类引用的方法,而不看子类对象的方法!!!
    


class Animal 
  private void eat()
    System.out.println("Animal is eating");
  


class Horse extends Animal 
  public void eat() 
    System.out.println("Horse is eating")
  
  • 7、子类不能用静态方法重写父类的非静态方法(编译不通过)。
  • 8、子类不能用非静态方法重写父类的静态方法(编译不通过)。

7、继承的缺点

1、父类变,子类就必须变。

2、继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。

3、继承是一种强耦合关系。

附:重载的相关知识

方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载(overload)是一个类中多态性的一种表现。Java的方法重载,就是再累中可以创建多个方法,他们具有相同的名字,但是具有不同的参数和不同的定义。

调用方法时通过传递给他们的不同参数个数和参数类型,来决定具体使用哪个方法,这就是多态性。

重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同,也可以不同,无法以返回类型作为重载函数的区分标准。

  • 重载的规则:

1、必须具有不同的参数列表

2、可以有不同的返回类型,只要参数列表不同就可以了;

3、可以有不同的访问修饰符;

4、可以抛出不同的异常。

  • 重载的特点:

1、在使用重载时,只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响

4、对于继承来说,如果某一方法在父类中访问权限时private,那么就不能在子类对其进行重载(前面提到了,也不是重写),如果定义的话,也只是定义了一个新的方法,而不会达到重载的效果。

重写与重载的区别

  • 重写(override)

    1、方法名、参数、返回值相同。

    2、子类方法不能缩小父类方法的访问权限。

    3、子类方法不能抛出比父类方法更多的异常(但子类可以抛出与被覆盖方法一致的异常或是其子类,或不抛异常)。

    4、存在于父类和子类之间。

    5、方法被定义为final不能被重写。

  • 重载(overload)

    1、参数类型、个数、顺序(建立在参数列表中参数型不同的基础上,说到底还是参数类型不同)至少有一个不相同。

    2、不能重载只有返回值不同的方法名。

    3、存在于父类和子类、同类中。

以上是关于关于Java中的继承,包括重写构造器访问权限构造过程等知识总结的主要内容,如果未能解决你的问题,请参考以下文章

day4(继承修饰符方法的重写super关键词继承中的构造方法object类对象转型)

java面向对象(继承)

Java学习笔记:面向对象

Java继承

Java学习 -- 继承性

Java学习 -- 继承性