这次我想深入探究以下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的基础,也是进一步学习高级概念,如接口、抽象类、异常处理和集合框架的关键步骤。
Java 中的继承(子类调用父类构造方法还不懂) Java 中的继承是指一个类可以继承另一个类的属性和方法,这样可以实现代码的复用和提高开发效率。在 Java 中,继承使用关键字 `extends` 来实现。 Java 中继承的注意...
总的来说,这个程序展示了Java中类的继承机制,如何通过构造方法传递参数来初始化对象,以及子类如何覆盖或扩展父类的属性。理解这些概念对于进行Java编程至关重要,因为它们构成了面向对象设计的基础。通过这样的...
Java期末考试复习时,应重点掌握这些基础知识,同时理解并能灵活运用类和对象的创建、继承、封装和多态性,熟悉Java集合框架的使用,理解异常处理机制,以及熟悉Java的输入输出和网络编程。通过做题和解答,可以有效...
【Java面向对象之继承练习...通过上述练习,可以深入理解Java中的继承机制,如何定义类和方法,以及如何通过继承扩展功能。同时,练习涵盖了构造方法、属性和方法的重写、多态以及类之间的关系等核心面向对象编程概念。
Java中的继承和接口是面向对象编程的关键特性,它们在软件设计中扮演着至关重要的角色,实现了代码的重用和类的层次结构。 继承是Java中创建新类的一种方式,它允许一个子类(SubClass)从一个已存在的父类...
Java中的继承机制是面向对象编程的核心特性之一,它允许子类继承父类的属性和方法,从而实现代码的复用和扩展。在这个场景中,我们关注的是Java继承时构造函数的调用规则。 首先,每个Java类都有一个或多个构造函数...
在Java编程语言中,`extends`关键字用于实现类的继承机制。类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`...
这是因为Java语言不支持多继承机制。 2. 在子类的构造方法中,必须将父类的构造方法调用放在第一句,否则将会出现编译错误。 3. 在子类中,可以使用super关键字来调用父类的方法和属性。 继承的使用可以使得代码...
通过实现接口,类可以拥有接口中声明的所有方法,这在单一继承机制下提供了更多的灵活性。接口还常用于定义常量,提供常量值的统一管理。 总结来说,Java的面向对象设计包括封装、继承和多态,这些特性使得代码更加...
Java的继承机制是面向对象编程中的核心特性,它允许一个类(子类)从另一个类(父类)继承属性和方法,从而实现代码的复用和扩展。在Java中,继承具有以下特点: 1. 单继承:不同于C++等语言,Java仅支持单继承,即...
Java 类和继承是面向对象编程的核心概念,它们构成了Java程序设计的基础。在这个代码集中,我们很显然会看到一系列关于如何创建和使用Java类以及实现继承的示例代码。以下是对这些概念的详细解释: 1. **Java 类**...
Java 类的继承是其面向对象特性中的核心概念之一,它为代码重用和构建复杂的软件结构提供了基础。在 Java 中,一个类可以扩展另一个类的功能,这个被...理解并熟练运用继承机制,对于编写高质量的 Java 应用至关重要。
接口则是一组方法签名,提供一种多继承机制。 总结,Java中的数组、方法和面向对象是构建程序的基础。熟练掌握这些概念,能帮助初学者逐步进入Java编程的世界,进一步探索更复杂的技术和框架。不断实践和理解,将有...
### 论JAVA继承机制中父类与子类的关系 #### 摘要 本文深入探讨了Java语言中的继承机制,并重点分析了父类与子类之间的关系。文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,...
本文探讨了 Java 中构造方法的概念、特点和应用,通过对构造方法的深入研究和探讨,阐述了其在继承和设计模式中的重要作用。 知识点一:构造方法的概念和特点 构造方法是 Java 中一个特殊的方法,它用来初始化对象...
Java继承是面向对象编程中的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用和扩展。在这个名为"java继承部分课件"的资料中,我们可以期待学习到关于Java继承的基础知识、...
本文将详细解释 Java 应用程序习题第五章中的知识点,包括继承关系、方法覆盖、方法重载、构造方法、类型转换等重要概念。 1. 继承关系 在 Java 中,类 Student 继承自类 Person,这是一种继承关系。继承关系是一...
Java继承机制详解 Java继承是面向对象编程(OOP)的一种机制,允许一个类继承另一个类的成员变量和成员方法。通过继承,可以实现代码的重用和扩展。 在Java中,继承是通过使用关键字`extends`来实现的。例如,`...