`

Core Java: 继承覆盖时的一个问题

阅读更多

看如下Java代码:

public class Main {	

	public static void main(String[] args) {

		Person person = new Student();		

		System.out.println("Name: "+person.getName()); // --> Guess

		person.setName("set outside");		

		System.out.println("After Name: "+person.getName()); // --> Guess

		Student student = (Student)person;		

		System.out.println("After cast, Name: "+student.getName()); // --> Guess

	}

}

class Person {

	private String name = "Person name";	//  --> (A)

	public void setName(String name) {

		this.name = name+"_ in superClass";

	}

	public String getName() {

		return this.name;

	}

}

class Student extends Person{

	private String name = "Student name";	 // --> (B)

	public void setName(String name) {

		this.name = name + "_ in subClass";

	}

	/*

	public String getName() {  --> (C)

		return this.name;

	}

	*/

}

    运行先猜下三个输出是什么? 接着做如下改动再猜结果: 把(A)处的private改为protected, 把(B)处一行注释掉, 把 (C)处的方法放开.

 

   运行结果怎么? 为什么?

 

分享到:
评论
2 楼 nijiaben 2009-04-14  
首先因为c处是被注释的,因此会从Person类中继承getName()方法,因此System.out.println("Name: "+person.getName());输出的是Person类中的name值,即Person name,而当调用person.setName("set outside");时,我们设置的是Student类的name属性值,当执行System.out.println("After Name: "+person.getName()); 时,那显然仍然是输出Person Name,转型之后,Student类本身没有getName属性,继承的仍然是Person类属性,因此输出的还是Person name;

对于你改动之后,因为你注释掉了子类中的name属性,因此student的name属性是继承自person的,子类可以继承父类的protected访问权限的属性和方法,因此在你第一次输出时肯定是输出Person name的,第二次person.getName()方法调用的是子类的getName()方法,因为它覆盖了父类的该实例方法,所以输出的是set outside_ in subClass,
最后转型之后,Student中的name属性在前面被重新赋值了,自然是前面的那个值了,即set outside_ in subClass;
所以改后的输出结果是:
Name: Person name
After Name: set outside_ in subClass
After cast, Name: set outside_ in subClass
1 楼 madbluesky 2009-03-02  
Name:Person name _ in superClass
After Name:Person name _ in superClass
After cast, Name:set outside _ in subClass
---- 结果应该是这样。
  这个问题其实是 在继承中字段是不能被覆盖的,而且private方法也不能被覆盖,其他通过多态机制就能理清

相关推荐

    Core Java

    10. **源文件规范**:一个源文件只能有一个public类,且文件名应与public类名一致。包名定义了类的组织结构,且包名应与文件存放的目录对应。 11. **标识符**:标识符用于命名变量、方法和类,以字母、下划线或美元...

    Java试题-CoreJava试题

    8. **if语句**:一个if语句可以跟任意多个else if,但只能有一个else。 9. **程序错误**:分为编译错误和运行时错误。 这些知识点覆盖了Java的基础语法、异常处理、多线程、对象和类、布局管理器等方面,对于学习和...

    学习笔记 java\CoreJava笔记\CoreJava_day06

    在Java编程语言中,继承是面向对象编程的一个关键特性,它允许子类继承父类的属性和方法,从而实现代码的复用和扩展。在Java中,类的继承是单继承的,即一个子类只能有一个直接父类,但可以通过接口实现多继承的效果...

    CoreJava:Java核心技术源代码

    《CoreJava:Java核心技术源代码》是一本深入探讨Java编程技术的经典著作,其代码库"CoreJavaBook代码"是学习和理解Java核心技术的重要资源。这个开源项目提供了丰富的示例和练习,帮助开发者深入掌握Java的核心概念...

    Java面试集锦: Core Java Essentials

    整体来看,《Java面试集锦: Core Java Essentials》是一本全面覆盖Java核心技术要点的面试辅导书籍。无论是对于即将参加面试的求职者,还是希望巩固Java基础知识的开发者,本书都提供了丰富的学习材料和面试问题,...

    core java 2

    《Core Java 2》第二卷详细介绍了Java的许多高级特性,这些特性让Java不仅仅是一个简单的编程语言,而是一个完整的平台,能够构建复杂、健壮的应用程序。它提供的最新信息和高级技术包括但不限于: 1. 多线程编程:...

    corejava java core

    压缩包中的"corejava核心技術九版"可能是指《Java核心技术》的第九版,该书详细介绍了上述的Java核心概念和技术,覆盖了从基础到高级的主题,是学习和提升Java技能的优秀教材。通过阅读这本书,开发者能够深入理解...

    CoreJava:Java基础

    - **继承**:一个类可以继承另一个类的属性和方法,实现代码复用。 - **多态**:同一种行为可以通过不同方式表现,例如方法重载和方法覆盖。 5. **异常处理**:Java使用try-catch-finally结构来捕获和处理异常,...

    Core Java Java的基本知识

    - 继承是一种使得一个类可以从另一个类获取属性和行为的方式。 - 关键字 `extends` 用于表示继承关系。 ##### 3. 多态 - 多态是指同一操作作用于不同的对象,可以有不同的解释,并产生不同的执行结果。 - 实现多态...

    core java 卷一英文版

    总的来说,《Core Java Volume I - Fundamentals 10th Edition》是一本全面覆盖Java基础的教程,无论是初学者还是经验丰富的开发者,都能从中受益。通过阅读这本书,你可以掌握Java编程的核心知识,为进一步深入学习...

    core java 学习java的书籍

    书中的内容覆盖了Java语言的基础语法、面向对象编程、异常处理、多线程、集合框架、输入输出、网络编程等多个方面,是学习Java不可或缺的参考资料。 首先,关于Java基础,本书详细介绍了变量、数据类型、运算符、...

    CoreJava:Java多线程

    当我们创建一个新的类,该类直接或间接地继承自Thread类时,我们就可以覆盖它的run()方法,然后创建该类的实例并调用start()方法来启动线程。start()方法会调用run()方法,但不会阻塞当前线程,而是将其放入操作...

    Core Java (vol 1&2)

    《Core Java (vol 1&2)》是Java编程领域中的经典教材,涵盖了从基础到高级的全方位知识。这两卷书对于深入理解Java语言及其应用至关重要。以下将详细阐述其中涉及的一些关键知识点。 **卷一:基础知识** 1. **Java...

    core.java.2.volume.1

    继承允许一个类(子类)从另一个类(父类)继承属性和方法,实现代码复用。多态则是指同一种行为在不同对象上有不同的表现形式,增强了代码的灵活性和扩展性。 书中还会涉及异常处理,这是Java中处理错误和异常情况...

    coreJava面试题

    ### CoreJava面试题知识点解析 #### 1. final, finally, finalize 的区别 - **final**: 是Java中的关键字,用于标记常量、方法或类,表明这些元素...- 类可以继承多个`Interface`,但只能继承一个`Abstract Class`。

    Core java经典试题

    2. **构造器在继承中的使用**:当一个类继承自另一个类时,如果子类没有显式地定义构造器,则会自动调用父类的无参构造器。如果需要调用父类的其他构造器,则可以在子类的构造器中使用`super`关键字。 #### 七、...

Global site tag (gtag.js) - Google Analytics