考虑继承时值得注意的几点
- 和传统的理解相反,子类并不是父类的一个子集。实际上,一个子类通常比它的父类包含更多的信息和方法。
- 父类中的私有数据域在该类之外是不可访问的。因此,不能在子类中直接使用它们。但是,如果父类中定义了公共的访问器/修改器,那么可以通过这些公共的访问器/修改器来访问和修改它们。
- 不是所有的“是”关系(is-a)都该用继承来建模。例如:一个正方形是一个矩形,但是不应该定义一个Square类来扩展Rectangle类,因为没有任何东西可以从矩形扩展(或者补充)到正方形。所以,应该定义一个扩展自GeometricObject类的Square类。如果要用类B去扩展类A,那么A应该要比B包含更多的信息。
- 继承是用来为“是”关系(is-a)建模的。不要仅仅为了重用方法这个原因而盲目地扩展一个类。例如:尽管Person类和Tree类可以共享类似高度和重量这样的通用特性,但是从Person类扩展出Tree类是毫无意义的。一个父类和它的子类之间必须存在“是”关系。
- 某些程序设计语言是允许从几个类派生出一个子类的。这种能力称为多重继承。但是在Java中,是不允许多重继承的。一个Java类只可能直接继承自一个父类。这种限制称为单一继承。如果使用extends关键字来定义一个子类,它只允许有一个父类。然而,多重继承是可以通过接口来实现的。
构造方法链
在任何情况下,构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法。如果父类继承自其他类,那么父类构造方法又会在完成自己的任务之前,调用它自己的父类的构造方法。这个过程持续到沿着这个继承体系结构的最后一个构造方法被调用为止。这就是构造方法链。
例如下面的代码:
public class Faculty extends Employee {
public static void main(String[] args){
new Faculty();
}
public Faculty() {
System.out .println("(4)Performs Faculty's tasks");
}
}
class Employee extends Person {
public Employee() {
this("(2) Invoke Employee's overloaded constructor");
System.out.println("(3) {erforms Employee's tasks ");
}
public Employee(String s) {
System.out.println(s);
}
}
class Person {
public Person() {
System.out.println("(1) Performs Person's tasks");
}
}
输出:
(1) Performs Person's tasks
(2) Invoke Employee's overloaded constructor
(3) Performs Employee's tasks
(4) Performs Faculty's tasks
在第3行,new Faculty()调用Faculty的无参构造方法。由于Faculty是Employee的子类,所以,在Faculty构造方法中的所有语句执行之前,先调用Employee的无参构造方法。Employee的无参构造方法调用Employee的第二构造方法(第12行)。由于Employee是Person的子类,所以,在Employee的第二个构造方法中所有语句执行之前,先调用Person的无参构造方法。
覆盖方法
子类从父类中继承方法,有时,子类而要修改父类中定义的方法的实现,这称做方法覆盖。
GeometricObject类中的toString方法返回表示几何对象的字符串。这个方法可以被覆盖,返回表示圆的字符串。为了覆盖它,如下代码:
public class Circle extends GeometricObject {
public String toString() {
return super.toString() + "\n radius is " + radius;
}
}
toString()方法在GeometricObject类中定义,在Circle类中修改。在这两个类中定义的该方法都可以在Circle类中使用。要在Circle类中调用定义在GeometricObject中的toString方法,使用super.toString()(第3行)。
Circle的子类不能用语法super.super.toString()访问定义在GeometricObject中的toString方法。这是一个语法错误。
以下几点值得注意:
- 仅当实例方法是可访问时,它才能被覆盖。这样,因为私有方法在它的类本身以外是不能访问的,所以它不能被覆盖。如果子类中定义的方法在父类中是私有的,那么这两个方法完全没有关系。
- 与实例方法一样,静态方法也能被继承。但是,静态方法不能被覆盖。如果父类中定义的静态方法在子类中被重新定义,那么定义在父类中的静态方法将被隐藏。可以使用语法:父类名.静态方法名 调用隐藏的静态方法。
分享到:
相关推荐
在这个“C#继承知识点”中,我们将深入探讨这一关键特性。 首先,我们要理解继承的基本语法。在C#中,子类通过使用冒号":"来声明其父类。例如,如果我们有一个名为`Animal`的父类,我们可以创建一个名为`Dog`的子类...
下面我们将深入探讨JAVA继承的相关知识点。 1. **继承的概念**: - 继承体现了类之间的层次结构,子类继承父类,表示子类是父类的一个特例,具备父类的所有特性但可能有所扩展。 - Java中声明继承使用`extends`...
这个是javase的抽象数据类型到继承的部分的一些知识点,写到PPT上面了
对于继承这个知识点的梳理,通过思维导图来理解透彻。
以下是一些关于继承的编码练习题及其相关知识点: 1. **卡车和小轿车**: 这个题目可能涉及创建一个`Vehicle`类作为基类,包含共有的属性如速度、颜色等。然后,`Truck`和`Car`类继承自`Vehicle`,添加特定的属性...
在这个"java关于继承的思维导图(Xmind)"中,我们可以看到作者对Java继承机制的详细梳理。 1. **类的层次结构** - 在Java中,类可以看作是对象的模板,通过继承,子类可以共享父类的特性。这构建了一个类的层次结构...
1. **继承的基础知识** - **复用与扩展**:继承的主要目的是复用代码,减少重复工作。派生类可以从基类继承成员,包括方法、字段、属性、事件和索引器,同时能添加新的特性。 - **单一继承**:在C#中,一个派生类...
总结来说,维护财产权管理及财务知识分析继承权是关于公民在死亡后如何合法有序地转移财产的法律问题。理解这些知识不仅有助于保障个人权益,也能避免因遗产纠纷引发不必要的矛盾。因此,理解和遵守《继承法》对于每...
下面将详细探讨`extends`关键字在Java中的使用、特点以及相关知识点。 1. **类的继承定义** - 在Java中,如果一个类用`extends`关键字后跟另一个类名,那么这个类就是父类的子类。例如: ```java public class ...
这是用C#开发的一个基本的实现计算机查看功能煅炼你的继承多态封装一些基本知识,很不错的哦
在这个名为"java继承部分课件"的资料中,我们可以期待学习到关于Java继承的基础知识、应用场景以及最佳实践。 在Java中,继承是通过使用`extends`关键字来实现的。例如,如果我们有一个名为`Animal`的父类,我们...
财产继承权管理学是关于如何管理和处理个人遗产在逝者去世后如何传递给亲属的一门学科,涉及到法律、财务和伦理等多个方面。在理解和应用这一领域知识时,我们需要明确几个核心概念。 首先,**遗产**是指被继承人在...
在这个“C++程序设计 继承与派生实验(二)”中,我们将深入探讨这三个关键知识点:类的派生与继承的概念、继承方式对成员访问权限的影响,以及虚基类的用法。 首先,让我们理解类的继承与派生。继承是面向对象设计...
财产继承权及财务管理是涉及个人财产分配和保护的重要领域,主要涵盖个人财产的归属、所有权的含义、法律保护公民财产所有权的意义...了解这些知识可以帮助人们更好地理解并处理财产继承中的复杂情况,保障自身权益。
财产继承管理权及财务知识分析主要涉及以下几个关键概念和原则: 1. 财产所有权:这涉及到个人对财产的完全支配权,包括使用权、收益权、处分权和占有权。例如,购买电脑即获得了财产所有权,可以使用、出租或出售...
本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...
根据提供的文件信息,我们可以分析并总结出关于JavaScript继承的一些关键知识点。尽管提供的代码示例主要关注于使用jQuery插件初始化一个表格(grid),但这里我们将重点放在如何在JavaScript中实现继承这一主题上。...
财产继承权及财务管理是公民生活中不可或缺的法律知识领域,它涉及到个人资产的保护、管理和传承。在这个案例中,王先生因为城市扩建面临拆迁,他的小百货店可能会遭受商业损失。根据我国宪法第十三条规定,公民的...
在Java编程语言中,继承、多态、集合和IO流是核心概念,它们构成了程序设计的基础框架。让我们逐一深入探讨这些知识点。 首先,**继承**是面向对象编程的一个关键特性,它允许一个类(子类)继承另一个类(父类)的...