Java子类与继承(考试必备)

  • Java不支持多重继承,即子类只能有一个父类。

  • 在类的声明中,通过使用关键字extends来定义一个类的子类。例如:class 子类名 extends 父类名{}

  • 如果C是B的子类,B又是A的子类,习惯上称C是A的子孙类。Java的类按继承关系形成树形结构(将类看作树上的结点),在这个树形结构中,根结点是Object类(Object是 java.lang包中的类),即Object是所有类的祖先类。

  • 任何类都是Object类的子孙类,每个类 (除了Object类)有且仅有一个父类,一个类可以有多个或零个子类。

  • 如果一个类(除了Object类)的声明中没有使用extends关键字,这个类被系统默认为Object的子类,即类声明 “class A”与“class A extends Object'”是等同的。

  • 如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。

  • 当子类和父类不在同一个包中时,父类中的private和友好访问权限的成员变量不会被子类继承,子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量;同样,子类只继承父类中的protected和public访问权限的方法作为子类的方法。

  • 对于子类D自己声明的protected成员变量和方法,只要Other类和D类在同一个包 中,object对象就可以访问这些protected成员变量和方法。

  • 对于子类D从父类继承的protected成员变量或方法,需要追溯到这些protected成员变量或方法所在的“祖先”类,例如可能是A类,只要Other类和A类在同一个包中,object对象能访问继承的protected变量和protected方法。

  • 当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配了内存空间,而且父类的成员变量也都分配了内存空间,但只将其中一部分(即子类继承的那部分成员变量)作为分配给子类对象的变量。父类中的private 成员变量尽管分配了内存空间,也不作为子类对象的变量,即子类不继承父类的私有成员变。同样,如果子类和父类不在同一包中,尽管父类的友好成员变量分配了内存空间,但也不作为子类对象的变量,即如果子类和父类不在同一包中,子类不继承父类的友好成员变量。

  • 子类继承的方法只能操作子类继承的成员变量或未继承的成员变量,不可能操作子类新声明的变量。

  • instanceof运算符是Java独有的双目运算符,其左面的操作元素是对象,右面的操作元素是类,当左面的操作元素是右面的类或其子类所创建的对象时,结果为true。

  • 在编写子类时仍然可以声明成员变量,一种特殊的情况是所声明的成员变量的名字和从父类继承来的成员变量的名字相同(声明的类型可以不同),在这种情况下子类就会隐藏所继承的成员变量。

    子类隐藏继承的成员变量的特点如下:

    1. 子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。

    2. 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。

  • 子类通过重写可以隐藏已继承的方法(方法重写称为方法覆盖(Method Overriding))。

  • 如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法(不包括final方法)。所谓方法重写,是指子类中定义一个方法,这个方法的类型和父类的方法的类型 一致或者是父类的方法的类型的子类型(所谓子类型,是指如果父类的方法的类型是“类”, 允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父 的方法完全相同。子类如此定义的方法称作子类重写的方法。

  • 重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。如果子类想使用被隐 藏的成员变量或方法,必须使用关键字super。

  • 父类的方法是Object类型,子类重写方法的类型可以是任何类型。

  • 在重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限(访问限制修饰 符按访问权限从高到低的排列顺序是public-→protected-→友好的→private)。

  • 子类一旦隐藏了继承的成员变量,那么子类创建的对象就不再拥有该变量,该变量将归关键字super所拥有。子类一旦隐藏了继承的方法,那么子类创建的对象就不能调用被隐藏的方法,该方法的调用由关键字super负责。

  • 如果想在子类中使用被子类隐藏的成员变量或方法,就需要使用关键字super。例如:super.x、super.play()就是访问和调用被子类隐藏的成员变量x和方法play()。

  • 当用super调用被隐藏的方法时,该方法中出现的成员变量是被子类隐藏的成员变量或继承的成员变量。

  • 当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。也就是说,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。

  • 由于子类不继承父类的构造方法,所以子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一个语句,即如果在子类的构造方法中没有显式地写出super关键字来调用父类的某个构造方法,那么默认有: super();

  • 如果在子类的构造方法中显式地写出了super关键字来调用父类的某个构造方法,那么编译器不再提供默认的super语句。

  • final关键字可以修饰类、成员变量和方法中的局部变量。

  • 不允许被继承就定义为final类。

  • 如果用final修饰父类中的一个方法,那么这个方法不允许子类重写,也就是说,不允许子 类隐藏可以继承的final方法(老老实实地继承,不许做任何篡改)。

  • 如果成员变量或局部变量被修饰为final,那么它就是常量。

  • 由于常量在运行期间不允许再发生变化,所以常量在声明时没有默认值,这就要求程序在声明常量时必须指定该常量的值。

  • 对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能(上转型对象相当于子类对象的一个“简化”对象)。

  • 上转型对象不能访问子类新增的 成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一些行为)。

  • 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个实例方法,当对象的上转型对象调用这个实例方法时一 定是调用了子类重写的实例方法。

  • 如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。

  • 多态性就是指父类的某个方法被其子类重写时可以各自产生自己的功能行为。

  • 用关键字abstract修饰的类称为abstract类(抽象类),例如: abstract class A{ }

  • 用关键字abstract修饰的方法称为abstract方法(抽象方法),例如: abstract int min(int x,int y);

  • 对于abstract方法,只允许声明,不允许实现(没有方法体)。

  • 不允许使用final和 abstract同时修饰一个方法或类,也不允许使用static和private修饰abstract方法,即 abstract方法必须是非private的实例方法(访问权限必须高于private)。

  • 和普通类(非abstract类)相比,abstract类中可以有abstract方法(非abstract类中不可 以有abstract方法),也可以有非abstract方法。

  • abstract类中也可以没有abstract方法。

  • 对于abstract类,不能使用new标识符创建该类的对象。如果一个非抽象类是某个抽象 类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不允许使用fial和 abstract同时修饰一个方法或类的原因。

  • 如果一个非abstract类是abstract类的子类,那么它必须重写父类的abstract方法,即去 掉abstract方法的abstract修饰,并给出方法体。如果一个abstract类是abstract类的子类, 那么它可以重写父类的abstract方法,也可以继承父类的abstract方法。

  • 可以使用abstract类声明对象,尽管不能使用new标识符创建该对象,但该对象可以成 为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法。

  • 在设计程序时经常会使用abstract类,其原因是abstract类只关心操作,不关心这些操作具体的实现细节,可以使程序的设计者把主要精力放在程序的设计上,而不必拘泥于细节的实

  • 使用多态进行程序设计的核心技术之一是使用上转型对象,即将abstract类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法。

  • 所谓面向抽象编程,是指当设计某种重要的类时不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。

  • 面向抽象编程的目的是应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。

  • 面向抽象编程的核心是让类中每种可能的变化对应地交给抽象类的一个子类去负责,从而让该类的设计者不用去关心具体实现,避免所设计的类依赖于具体的实现。面向抽象编程使设计的类容易应对用户需求的变化。

  • 所谓“开-闭原则(Open-Closed Principle),就是让设计的系统对扩展开放,对修改关闭。本质是指当系统中增加新的模块时不需要修改现有的模块。在设计系统时,应当首先考虑到用户需求的变化,将应对用户变化的部分设计为对扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分应当是对修改关闭的,即不能因为用户的需求变化而再发生变化,因为这部分不是用来应对需求变化的。如果系统的设计遵守了“开-闭原则”,那么这个系统一定是易维护的,因为在系统中增加新的模块时不必去修改系统中的核心模块。

  • 继承是一种由已有的类创建新类的机制。利用继承,可以先创建一个共有属性的一般类,再根据该一般类创建具有特殊属性的新类。

  • 所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作。

  • 所谓子类继承父类的方法作为子类中的一个方法,就像它们是在子类中直接声明一 样,可以被子类中自己声明的任何实例方法调用。

  • 子类继承的方法只能操作子类继承和隐藏的成员变量。

  • 子类重写或新增的方法能操作子类继承和新声明的成员变量,但不能直接操作隐藏的成员的变量(需使用关键字super操作隐藏的成员变量)。

  • 多态是面向对象编程的又一重要特性。子类可以体现多态,即子类可以根据各自的需要重写父类的某个方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。

  • 在使用多态设计程序时要熟练使用上转型对象以及面向抽象编程的思想,以便体现程序设计所提倡的“开-闭原则”。

很棒欸!都已经学到了这里啦!请继续保持热情,继续学习吧!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值