zoukankan      html  css  js  c++  java
  • Java总结---继承(不断完善ing..)

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


    继承


    一、目的:实现代码的复用

    二、简单例子(A继承了C):
    public class A extends C {
    	
    	//检测哪些可以在子类里使用
    	public void test22(){
    		
    		//int aa = a;private报错,权限不可见(编译不通过)
    		
    		int bb = b;//默认(包)访问权限的因为和父类在同一个包所以通过,否则不通过
    		
    		int cc = c;//protected的(编译通过)
    		
    		int dd = d;//public的(编译通过)
    	}
    }
    
    class C{
    	private int a; 
    	int b;
    	protected int c;
    	public int d;
    }
    三、继承的本质

    这个得从两个角度讲:继承语法角度 和 内存实现角度

    1.对于继承语法角度(来自oracle的java语言规 范

    Members of a class that are declared private are not inherited by subclasses
    of that class.

    Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is 
    declared.

    Constructors, static initializers, and instance initializers are not members and 
    therefore are not inherited.(构造器、静态初始化块、实例初始化块不继承)

    2.然而,从内存实现角度。

    子类是“继承”了父类全部,更具体的,如《java编程思想》129页里写道:
      创建导出类时,该导出类对象会包含基类的子对象只是说这个子对象不全对外开放(开放多少?根据访问修饰符决定)。
    根据访问修饰符,子类和父类如果:
    --1在同一个包:public,protected,默认访问级别(包访问级别) 三种类型
    --2不在同个包: public,protected 两种

    四、基本语法

    (1)Java不支持多继承,也就是说子类至多只能有一个父类(但可以有多个间接父类,比如所有类都直接或间接继承自Object类)。

    (2)super与this:
    在子类变量或方法 与 父类重名时,可用super this特指区分。super还可用来访问 子类对象持有的父 类子对象的构造器、变量等。(由于子类对象持有父类子对象的特性,静态域不能使用super)

    (3)构造器不能被继承,但是子类初始化前一定要(或自动)被调用。

    (4)多次讲解和访问修饰符有关,贴出下图关系:

        访问权限   类   包  子类  其他包

         public       ∨   ∨   ∨     ∨

         protect     ∨   ∨   ∨     ×

         default    ∨   ∨   ×     ×

         private     ∨   ×   ×     ×

    四、方法的重载和覆盖(或者说重写,一个意思)

    (1)方法重载(Overload)

    定义:对于类的方法(包括从父类中继承的方法),如果有两两个方法的方法名相同,但参数列表(参数的顺序也得考虑不一致,那么可以说一个方法是另个的重载。

    必须满足的条件:
    --方法名相同
    --参数列表(类型,个数或顺序)不同
    --返回值类型可以不同(不能以返回值区分重载!)
    --方法的修饰符可以不同

    (2)方法重写(覆盖)(Override)

    定义:子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型相匹配,那么可以说,子类方法覆盖了父类的方法

    必须满足的条件(来自《java面向对象编程》)
    1.名称、参数签名和返回类型相同。子类方法的返回值与父类必须相同。

    2.方法覆盖中子类方法不能缩小父类方法的访问权限。例如父类方法是public的,子类方法不能是默认修饰,protected,private修饰。(防止与多态冲突)

    3.子类方法不能抛出比父类方法更多的异常

    4.方法覆盖只能是在子类和父类之间,同一个类中只能是方法重载。

    5.父类的静态方法不能被覆盖成非静态方法

    6.子类可以覆盖父类中的静态方法,用以屏蔽父类中的静态方法。

    7。父类的非静态方法不能被子类覆盖为静态方法。

    8.父类的私有方法不能被子类覆盖

    9.父类的抽象方法可以被子类通过两中途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。

    10.父类的非抽象方法可以被子类覆盖成抽象方法。

    (3)覆盖与重载的异同



    五、继承的缺陷

      1、继承破坏了封装(最大的缺陷)于父类而言,它的实现细节对于子类来说都是透明的

             2、父类变,子类就必须变

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

           所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。

          慎用继承!


    参考:

    1.《java面向对象编程》孙卫琴

    2.《java编程思想》

    3.http://blog.csdn.net/chenssy/article/details/12785831utm_source=itdadao&utm_medium=referral

    4.http://blog.csdn.net/nanruitao10/article/details/52635038?

  • 相关阅读:
    java foreach遍历的前提条件
    Java中的null值总结
    mybatis不可忽略的细节
    设计模式:创建型模式
    设计模式(四):原型模式
    设计模式(三):建造者模式
    设计模式(二):单例模式(DCL及解决办法)
    设计模式(一):简单工厂、工厂模式、抽象工厂
    定时任务 ScheduledExecutorService
    快速访问GitHub
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9381018.html
Copyright © 2011-2022 走看看