java基础(2)

1.继承:

1)特性:

①子类拥有父类非 private 的属性、方法(根据父类属性方法的访问限制符(protected,private,public,default)决定是否拥有)

②子类可以拥有自己的属性和方法,即子类可以对父类进行扩展

③Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性

④提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)

2)继承关键字:

继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类

 extents:在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

implements :使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)

3)super和this

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类,super()代表调用父类的构造器。

this关键字:指向自己的引用,this()代表调用自己的构造器。

4)构造器:

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

理解:当实例化子类之前会先实例化父类,那么必然要调用父类的构造器,所以有了上述的描述:当你调用子类构造器时,如果父类有无参构造器,则会自动调用,如果没有,你就必须在子类构造器内部显式的通过super(参数)调用父类构造器,构造器属于方法所以受访问限制符控制,比如如果父类构造器全部为default(即你没有定义任何访问控制符),那么不同包的子类将报错,there is no default constructor available in "父类",因为父类的default构造器在不同包子类不可见,所有无法隐式或显式的调用。

其他:

1.如果在子类构造器中使用this(),那么将不再隐式调用父类构造器,显式调用也不行,因为super()和this()必须放在构造器方法体的第一行,假如类中有n个构造器,那么在最多使用n-1个,因为如果使用n个,会造成recursive constructor invocation 循环的构造器调用,所以,当你是用this()来调用自身的其他构造方法时,那么最后一个被调用的肯定没有this(),这样最后一个就可以隐式或显式的调用父类的构造方法来初始化子类从父类继承的属性。

2.父类在子类实例化过程中是并没有被实例化,java中new子类没有实例化父类,只是调用父类的构造方法初始化了子类从父类继承来的属性,这个调用是子类的对象调用的父类的构造方法。子类自己的构造方法完成对自己属性的初始化

 2.重写(override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变(返回值变了会报错,形参变了就不是同一个方法了),

重写规则:

1)参数列表必须完全与被重写方法的相同

2)返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类

3)访问权限不能比父类中被重写的方法的访问权限更低

4)父类的成员方法只能被它的子类重写

5)声明为final的方法不能被重写

6)声明为static的方法不能被重写,但是能够被再次声明(父类的方法被声明为static,子类的同名方法必须声明为static)

7)子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final,static的方法

8)子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法

9)重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以

10)构造方法不能被重写

11)如果不能继承一个方法,则不能重写这个方法

3.重载(overload)

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载

特性:

1)被重载的方法必须改变参数列表(参数个数或类型不一样)

2)被重载的方法可以改变返回类型

3)被重载的方法可以改变访问修饰符

4)被重载的方法可以声明新的或更广的检查异常

5)方法能够在同一个类中或者在一个子类中被重载

6)无法以返回值类型作为重载函数的区分标准

重写与重载的区别:

1)重载的参数列表必须不一样,重写必须一样

2)重载的返回类型可以不一样,重写必须一样

3)重载抛出的异常可以修改,重写可以是一样,或者抛出被重写的方法的子类,或者不抛出

4)重载的访问限制可以修改,重写一定不能做更严格的限制(可以降低限制)

总结:方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式

1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)

2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)

3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现

转载于:https://www.cnblogs.com/yuby/p/10823814.html

你可能感兴趣的:(java基础(2))