偶然间看到这篇将java继承的文章觉得比较有趣,所以记下来备忘
文章地址http://www.iteye.com/topic/180601
看下面代码的输出
public class Test1 {
int i = 1;
public void say(){
System.out.println(i);
}
}
public class Test2 extends Test1{
int i = 2;
public static void main(String []args){
new Test2().say();
}
}
不看上面的帖子,你能猜到会输出几么?
答案是:1
ps:即使Test1中i为private 那也是输出1。不信可以自己测试
如果你的答案也是1,那么恭喜你答对了。可以不用往下看了。
现在有两个问题:
1.为什么输出的是1,而不是2?
2.Test1到底有没有被创建对象?也即是说new Test2()这句创建了几个对象。
先说第二个问题
到底创建了几个对象呢? 答案当然是一个。从DEBUG运行可知,自始至终只有一个this,只是里面有两个名称为i的变量。但一个对象里面是不可能出现两个重名的可见变量的,所以有一个必然被隐藏,毫无疑问自然是父类的i变量。
这里有一个本质的问题,那就是调用一个类的构造方法是对类的实例化么?从对象的初始化顺序可知父类的构造方法是优先子类被调用的。我的理解是父类构造方法的调用是为了对其实例变量的初始化,地球人都知道实例变量的初始化总是在构造方法中进行。
再说第二个问题
因为多态只发生在方法的调用上,和变量没关系。所以和多态无关。那么这也只能从语言上面解释了,即父类对其类变量的调用结果不会受其子类同名变量的影响。
下面代码输出说明多态只发生在方法之上
public class Test1 {
int i = 1;
public void say(){
System.out.println(i);
}
}
public class Test2 extends Test1{
int i = 2;
public static void main(String []args){
Test1 t = new Test2();
System.out.println(t.i);
}
}
/*
output:
1
*/
以上仅供参考,个人一点理解。
如果我理解有误请告诉我,只是希望自己不要对别人产生误导。
分享到:
相关推荐
在这个场景中,我们关注的是Java继承时构造函数的调用规则。 首先,每个Java类都有一个或多个构造函数,它们的主要作用是在创建对象时初始化对象的状态。如果一个类没有显式定义任何构造函数,Java编译器会自动生成...
继承的特点:只需明确一点,java 只支持单继承,不支持多继承,但支持多重继承。 Java 中继承的实现方式有两种: 1. 单继承:一个子类只能继承一个父类。 2. 多重继承:一个子类可以继承多个父类,但 Java 语言中...
"Java学习,一点就通,你还在等什么"这个标题暗示了通过深入学习Java,你可以快速掌握其核心概念并应用于实际项目。对于那些对Java感兴趣或者想要提升自己编程技能的人来说,这是一个鼓励和召唤。 描述中提到的“最...
Java提供了一个特殊的关键字`super`来实现这一点。例如: ```java public class ParentClass { public ParentClass(int value) { // 父类构造方法 } } public class ChildClass extends ParentClass { public ...
### Java编程思想之接口Java中实现多重继承 #### 一、引言 在面向对象编程中,多重继承一直是讨论的热点之一。C++等语言支持直接的多重继承,而Java则通过接口机制来实现类似的多重继承特性。本文将详细介绍如何在...
在此之前,Java一直避免多继承带来的复杂性问题,仅允许一个类继承单一父类并实现多个接口。然而,在接口中添加默认方法之后,Java实际上引入了一种形式上的多继承。本文将深入探讨这一特性及其带来的影响。 #### ...
### Java 必须知道的一些问题:入门必备 在学习 Java 的过程中,掌握一些核心概念和技术是十分必要的。本文将从给定的文件标题、描述、标签以及部分内容中提炼出重要的知识点,帮助初学者更好地理解 Java 的基本...
Java中一个类可以继承一个抽象类,但只能实现多个接口。正确使用抽象类和接口可以使代码更加灵活和易于扩展。 #### 泛型与枚举 - **基础知识:** 泛型是Java SE 5引入的新特性,它允许创建参数化类型,从而可以在...
Java的继承机制允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以覆盖继承自父类的方法,也可以继承父类的所有属性和行为。 Java中的接口(Interface)定义了一种规范,它规定了实现该接口的类必须...
总的来说,"java课件入门一点通"提供了基础的面向对象编程概念,包括类和对象的定义、对象的属性和方法、对象与类的关系,以及面向对象技术的意义和应用。这些基础知识对于初学者理解Java编程至关重要,也是进一步...
- 软件学院05级OOP第二次测验试题及答案.doc:这可能是关于面向对象编程的一次测试,包括类、对象、封装、继承、多态等概念。 - OOP是Java的核心,理解类的定义、对象的创建和销毁、属性与方法的封装、单一职责...
2. **面向对象编程**:Java是面向对象的语言,因此在开发小游戏时,你需要了解类、对象、封装、继承和多态等概念。通过创建游戏对象,如角色、敌人、道具等,可以构建游戏逻辑。 3. **图形用户界面(GUI)**:Java...
"一点课堂 JAVA核心知识点整理.zip"这个压缩包文件包含了关于Java编程的关键概念和技能的详细总结,非常适合初学者和有经验的开发者进行学习和复习。 首先,Java的核心知识点包括基础语法。这包括变量声明、数据...
Java 类的私有成员(private members)在继承机制中的行为是一个关键的概念,它涉及到类的封装性和面向对象编程的基本原则。通常,私有成员(包括字段和方法)在其定义的类内部是可访问的,但在类的外部以及子类中是...
混入允许模块中的方法被其他类直接继承和使用,这是一种不同于Java继承的独特方式。 在错误处理方面,Ruby使用异常(Exception),这一点与Java相同。然而,Ruby鼓励使用异常来控制程序流程,而在Java中,过度使用...
这项规范是Java 1.5(代号Tiger)版本的一部分,它继承了JSR-176项目。该规范修订了Java语言规范第二版第17章和Java虚拟机规范第二版第8章中关于内存模型和线程的描述。最终JSR-133规范将直接纳入修订后的Java语言...
线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,用于避免多线程环境下的数据竞争问题。 Java标准库(JDK)提供了丰富的API,例如Swing和JavaFX用于创建图形用户界面,JDBC用于数据库连接...
- **API文档**:按照包(package)进行组织,详细解释了每个类的继承关系、接口实现、应用场景等。 #### 八、Java Web编程学习资源 - **HTTP协议**:学习Java Web编程前需先熟悉HTTP协议的基础知识。 - **Servlet ...
安全性方面,Java在设计时就考虑到了安全性问题,提供了一系列安全特性,包括类加载器的安全机制和安全API。 Java的编译和执行过程涉及编译器和解释器。Java源代码首先由Java编译器编译成字节码文件,然后这些字节...