`
酷的飞上天空
  • 浏览: 521737 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

Java继承的一点问题

阅读更多

偶然间看到这篇将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中什么是继承.docx

    继承的特点:只需明确一点,java 只支持单继承,不支持多继承,但支持多重继承。 Java 中继承的实现方式有两种: 1. 单继承:一个子类只能继承一个父类。 2. 多重继承:一个子类可以继承多个父类,但 Java 语言中...

    Java学习,一点就通,你还在等什么

    "Java学习,一点就通,你还在等什么"这个标题暗示了通过深入学习Java,你可以快速掌握其核心概念并应用于实际项目。对于那些对Java感兴趣或者想要提升自己编程技能的人来说,这是一个鼓励和召唤。 描述中提到的“最...

    Java 基础类的继承与覆盖

    Java提供了一个特殊的关键字`super`来实现这一点。例如: ```java public class ParentClass { public ParentClass(int value) { // 父类构造方法 } } public class ChildClass extends ParentClass { public ...

    Java编程思想之接口Java中实现多重继承.doc

    ### Java编程思想之接口Java中实现多重继承 #### 一、引言 在面向对象编程中,多重继承一直是讨论的热点之一。C++等语言支持直接的多重继承,而Java则通过接口机制来实现类似的多重继承特性。本文将详细介绍如何在...

    Java8编程小知识分享:默认方法和多继承

    在此之前,Java一直避免多继承带来的复杂性问题,仅允许一个类继承单一父类并实现多个接口。然而,在接口中添加默认方法之后,Java实际上引入了一种形式上的多继承。本文将深入探讨这一特性及其带来的影响。 #### ...

    java必须知道的一些问题,入门必备

    ### Java 必须知道的一些问题:入门必备 在学习 Java 的过程中,掌握一些核心概念和技术是十分必要的。本文将从给定的文件标题、描述、标签以及部分内容中提炼出重要的知识点,帮助初学者更好地理解 Java 的基本...

    最近5年133个Java面试问题列表

    Java中一个类可以继承一个抽象类,但只能实现多个接口。正确使用抽象类和接口可以使代码更加灵活和易于扩展。 #### 泛型与枚举 - **基础知识:** 泛型是Java SE 5引入的新特性,它允许创建参数化类型,从而可以在...

    Java练习题库(含答案及解析).pdf

    Java的继承机制允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以覆盖继承自父类的方法,也可以继承父类的所有属性和行为。 Java中的接口(Interface)定义了一种规范,它规定了实现该接口的类必须...

    java课件入门一点通

    总的来说,"java课件入门一点通"提供了基础的面向对象编程概念,包括类和对象的定义、对象的属性和方法、对象与类的关系,以及面向对象技术的意义和应用。这些基础知识对于初学者理解Java编程至关重要,也是进一步...

    一点Java复习资料

    - 软件学院05级OOP第二次测验试题及答案.doc:这可能是关于面向对象编程的一次测试,包括类、对象、封装、继承、多态等概念。 - OOP是Java的核心,理解类的定义、对象的创建和销毁、属性与方法的封装、单一职责...

    java小游戏 java小游戏

    2. **面向对象编程**:Java是面向对象的语言,因此在开发小游戏时,你需要了解类、对象、封装、继承和多态等概念。通过创建游戏对象,如角色、敌人、道具等,可以构建游戏逻辑。 3. **图形用户界面(GUI)**:Java...

    一点课堂 JAVA核心知识点整理.zip

    "一点课堂 JAVA核心知识点整理.zip"这个压缩包文件包含了关于Java编程的关键概念和技能的详细总结,非常适合初学者和有经验的开发者进行学习和复习。 首先,Java的核心知识点包括基础语法。这包括变量声明、数据...

    Java类中的私有成员的继承机制.pdf

    Java 类的私有成员(private members)在继承机制中的行为是一个关键的概念,它涉及到类的封装性和面向对象编程的基本原则。通常,私有成员(包括字段和方法)在其定义的类内部是可访问的,但在类的外部以及子类中是...

    From Java to Ruby

    混入允许模块中的方法被其他类直接继承和使用,这是一种不同于Java继承的独特方式。 在错误处理方面,Ruby使用异常(Exception),这一点与Java相同。然而,Ruby鼓励使用异常来控制程序流程,而在Java中,过度使用...

    Java 内存模型

    这项规范是Java 1.5(代号Tiger)版本的一部分,它继承了JSR-176项目。该规范修订了Java语言规范第二版第17章和Java虚拟机规范第二版第8章中关于内存模型和线程的描述。最终JSR-133规范将直接纳入修订后的Java语言...

    java学习笔记来自java黑马B站网课,没有图片 看不了一点

    线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,用于避免多线程环境下的数据竞争问题。 Java标准库(JDK)提供了丰富的API,例如Swing和JavaFX用于创建图形用户界面,JDBC用于数据库连接...

    JAVA入门教程21天学通JAVA2第三版

    - **API文档**:按照包(package)进行组织,详细解释了每个类的继承关系、接口实现、应用场景等。 #### 八、Java Web编程学习资源 - **HTTP协议**:学习Java Web编程前需先熟悉HTTP协议的基础知识。 - **Servlet ...

    Java面试题汇总.pdf

    安全性方面,Java在设计时就考虑到了安全性问题,提供了一系列安全特性,包括类加载器的安全机制和安全API。 Java的编译和执行过程涉及编译器和解释器。Java源代码首先由Java编译器编译成字节码文件,然后这些字节...

Global site tag (gtag.js) - Google Analytics