这次我想深入探究以下java里类的继承机制。
我们知道,继承是java设计里的一个失败的地方。高司令说过:如果让他重新设计java的话,他会把继承去掉。而java里继承到底怎么了,会这么不受人欢迎呢?
我们知道,继承设计的初衷是为了代码复用。在C++里也确实做到了这一点,因为C++允许多重继承。特别是C++里的析构函数,申明为了virtual的时候可以多重复用,用起来也很舒服。
那么为什么在java里继承就这么让人诟病呢?
第一:java里的类不能多重继承,如果一个类一旦继承了它的父类,那么它就别想再继承别的类。一个儿子只能有一个老爸,原本设计是没错的。可是在实际应用中,就会出现各种问题。
第二:java里有更好的接口,接口从本质上来说可以更好的代替继承。实现像C++里一样的宏定义的功能,把你想要的东西都抽象在接口里,让具体的类去实现这些功能。
如果你去面试过,肯定遇到过不少考察java继承机制的题目,其中最显著的一个就是构造函数的调用和重写方法的调用。
这里我再强调一下重载和重写:
重载是同一个类里面相同方法名,不同参数类型或个数的方法。这也是C++类里面为什么出现函数模板的原因,就拿求和来说:
int add(int a,int b);
long add(long a,long b);
int main(){
}
因为求和可能是求int的和,也可能是求long的和,这个时候就出现了需求(我始终认为,一种东西的出现必定是因为对他的需求)
而重写呢,就是子类对父类里的方法的重改,就是他改写了父类的方法。伦理上看似不孝,而道理上是事物总是要不断发展的。这就像是社会的改革一样。
下面我来分析一下父类和子类的构造函数调用顺序:
在内存机制中,父类和子类是占用同一块内存的,只不过子类在父类的基础上增加了自己的部分(包括数据成员和属性),这样一来就好理解了。子类是依附于父类的,先有父类再有子类。所以说一个子类对象的产生,必须先调用父类的构造函数产生一个父类实例,然后在这个实例基础上添加自己的部分。
而实际的运行机制,也正是这样的。
因为这样就很容易理解了,先调用父类的构造函数,再调用子类的构造函数。
而对于父类和子类里重写的方法的调用,关键要看:子类到底是否产生,如果子类产生了,子类改写了父类的方法,看似父类和子类各自有一个方法,其实它们在内存模型里占用的是同一块内存,子类方法会覆盖父类方法。
我们看下面的程序:
class SuperStringTest {
SuperStringTest(){
System.out.println("Father is constructed.");
}
public void test(){
System.out.println("Father is running.");
}
}
public class StringTest extends SuperStringTest{
StringTest(){
System.out.println("Son is constructed.");
}
public void test(){
System.out.println("Son is running.");
}
public static void main(String[] args){
/*
SuperStringTest sst = new StringTest();
此时,派生类的方法覆盖了基类的方法,基类的方法对派生类来说为不可见(有先像作用域),也就是派生类里的同名方法重新写了基类的同名方法。此时,对基类和派生类来说只有被派生类改写后的唯一的一个方法。所以,只能调用派生类的方法。
Father is constructed.
Son is constructed.
Son is running.
*/
/*
StringTest sst = new StringTest();
解释同上面
Father is constructed.
Son is constructed.
Son is running.
*/
/*
SuperStringTest sst = new SuperStringTest();
此时,基类所占的内存单元中并没有派生类的东西。所以,方法没被改写,调用父类的方法。
Father is constructed.
Father is running.
*/
sst.test();
}
}
分享到:
相关推荐
Java继承机制在图形类中的应用 Java继承机制是一种重要的面向对象编程技术,通过继承机制,可以实现代码的重用和简化程序设计。在本例中,我们将使用Java继承机制编写一个抽象的图形类Shape,并编写两个子类矩形类...
Java实验报告三,声明一个shape接口,计算圆,矩形,三角形的面积和周长。
【Java面向对象之继承练习...通过上述练习,可以深入理解Java中的继承机制,如何定义类和方法,以及如何通过继承扩展功能。同时,练习涵盖了构造方法、属性和方法的重写、多态以及类之间的关系等核心面向对象编程概念。
总的来说,这个程序展示了Java中类的继承机制,如何通过构造方法传递参数来初始化对象,以及子类如何覆盖或扩展父类的属性。理解这些概念对于进行Java编程至关重要,因为它们构成了面向对象设计的基础。通过这样的...
Java中的继承和接口是面向对象编程的关键特性,它们在软件设计中扮演着至关重要的角色,实现了代码的重用和类的层次结构。 继承是Java中创建新类的一种方式,它允许一个子类(SubClass)从一个已存在的父类...
java类和对象继承多态性是java语言中的一种基本机制,它允许开发者创建一个新的类,并继承已有的类的属性和行为。这种机制可以提高代码的复用性和维护性。 继承是java语言中的一种机制,通过继承,开发者可以创建一...
在Java编程语言中,继承是面向对象特性之一,它允许我们创建一个类(子类或派生类)作为现有类(父类...通过学习这个实例,开发者能够更好地理解和运用Java的继承机制,从而在实际项目中实现更灵活、可扩展的代码结构。
Java 类的继承是其面向对象特性中的核心概念之一,它为代码重用和构建复杂的软件结构提供了基础。在 Java 中,一个类可以扩展另一个类的功能,这个被...理解并熟练运用继承机制,对于编写高质量的 Java 应用至关重要。
这个实例是关于如何在超市购物场景下应用继承机制的。在这个系统中,我们有以下几个关键类:`ShoppingCar`(购物车)、`Database`(数据库)、`McBean`(可能代表某种商品或服务)、`TestShoppingCar`(测试类)以及...
Java语言采用了单一继承机制,即一个类只能从一个父类继承,这有助于提高代码的可读性和可维护性。然而,当内部类继承涉及到多层继承时,问题就会变得更加复杂。 内部类的继承可能导致以下几个问题: 1. **理解...
### 面向对象抽象思维与Java继承机制 #### 一、抽象的含义 在面向对象编程中,**抽象**是一种关键概念,它涉及到从具体的实体中提取共同特征和行为的过程。通过抽象,程序员能够专注于对象的核心特征和功能,而...
在Java编程语言中,`extends`关键字用于实现类的继承机制。类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`...
Java继承机制详解 Java继承是面向对象编程(OOP)的一种机制,允许一个类继承另一个类的成员变量和成员方法。通过继承,可以实现代码的重用和扩展。 在Java中,继承是通过使用关键字`extends`来实现的。例如,`...
Java的继承机制是面向对象编程中的核心特性,它允许一个类(子类)从另一个类(父类)继承属性和方法,从而实现代码的复用和扩展。在Java中,继承具有以下特点: 1. 单继承:不同于C++等语言,Java仅支持单继承,即...
Java 类和继承是面向对象编程的核心概念,它们构成了Java程序设计的基础。在这个代码集中,我们很显然会看到一系列关于如何创建和使用Java类以及实现继承的示例代码。以下是对这些概念的详细解释: 1. **Java 类**...
综上所述,Java的类机制提供了丰富的功能,包括但不限于类的声明、继承、抽象类、接口、封装以及多态等特性,这些机制共同构成了Java强大的面向对象编程能力。掌握这些基本概念对于编写高效、可维护的Java程序至关...
本资源摘要信息是关于 Java 中继承和多态的题目,涵盖了面向对象编程的基本概念和继承机制的应用。 继承的概念 继承是面向对象编程的一种机制,允许一个类(子类)继承另一个类(父类)的属性和方法。继承的目的是...
Java 语言中的继承机制允许一个类继承另一个类的属性和行为,实现代码的重用和继承关系建模。在 Java 中,继承是通过使用 `extends` 关键字来实现的,格式为 `public 子类 extends 父类{}`。 继承的优点: 1. 代码...
* 继承机制:Java语言中的继承机制允许一个类继承另一个类的属性和方法。 * 多态机制:Java语言中的多态机制允许一个对象以不同的形式表现出来。 * 接口:Java语言中的接口是一种抽象的类,它定义了一组方法,但不...
### 论JAVA继承机制中父类与子类的关系 #### 摘要 本文深入探讨了Java语言中的继承机制,并重点分析了父类与子类之间的关系。文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,...