问一个关于继承的问题

guilianlele 2009-07-24 06:35:02

class Base
{
public String name = "base";
public void getName(){
System.out.println(name);
}
}
class Son extends Base
{
public String name = "son";
}
class TestExtend
{
public static void main(String [] args){
Son s = new Son();
s.getName();
}
}


为什么getName访问的是父类的name?son不是已经集成了getName函数了么?
...全文
299 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
doney_dongxiang 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arsenal_no1 的回复:]
你的子类没有覆盖父类中的getName()方法,因此s.getName()调用的是父类中的getName()方法
即返回的是父类中的name
除非子类覆盖了父类中的getName(),不然不可能返回子类的name

[/Quote]


class Base
{
public String name = "base";
public void getName()
{
System.out.println(name);
}
}

class Son extends Base
{
public String name = "son";
public void getName()
{
System.out.println(name);
}


}

class TestExtend
{
public static void main(String [] args)
{
Son s = new Son();
s.getName();
}
}




建议楼主这样试试,对比一下 旧明白了
  • 打赏
  • 举报
回复
class Son extends Base
{
public String name = "son";
public void getName(){
System.out.println(name);
}

}
fsn011362 2009-07-27
  • 打赏
  • 举报
回复
学习学习,重温一下功课
win2503 2009-07-27
  • 打赏
  • 举报
回复
没有重写get方法 就只能输出父类的name
program___Madman 2009-07-27
  • 打赏
  • 举报
回复
子类没有覆写父类的方法,当NEW子类的对象的时候,调用的方法仍然是父类的。如果你用父类引用指向子类对象,这个时候就出现多态了。
ZiSheng 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 guilianlele 的回复:]
System.out.println("属性名称:"+field.getName()+":"+field.get());
这样也报错
[/Quote]

public class Test
{
public static void main(String [] args)throws Exception{
Son s = new Son();
s.getName();
//检查son类的域
Field[] fields=s.getClass().getFields();
for(Field field:fields){
System.out.println(field.getName());
System.out.println(field.get(s));
}
}
}
guilianlele 2009-07-25
  • 打赏
  • 举报
回复
System.out.println("属性名称:"+field.getName()+":"+field.get());
这样也报错
guilianlele 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 zisheng 的回复:]
import java.lang.reflect.*;
[/Quote]
谢谢 哥们,你这个程序让我明白了很多,我再问下 怎么样把属性的值打印出来?field.getValue()不行呀
ZiSheng 2009-07-25
  • 打赏
  • 举报
回复
import java.lang.reflect.*;
guilianlele 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zisheng 的回复:]
Java codeclass Base
{public String name="base";publicvoid getName(){
System.out.println("当前对象所在的类名称"+this.getClass().getName());
System.out.println(name);
}
}class Sonextends Ba¡­
[/Quote]
哥们,你这个程序报错呀,是不是要引入什么类呀 提示'找不到 field[]'
ericming200409 2009-07-25
  • 打赏
  • 举报
回复
学习了。。。。。。
ZiSheng 2009-07-25
  • 打赏
  • 举报
回复
也就是说son有两个name属性,一个是继承来的,一个是自己定义的
当访问name属性的方法在父类里边的时候,访问的name是父类的。
当访问的name属性在子类的时候,访问的name属性是子类的。
下边你把getName移动子类中看看:

import com.sun.java_cup.internal.internal_error;

import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.PriorityQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.lang.reflect.*;
class Base
{
public String name = "base";

}
class Son extends Base
{
public String name = "son";
public void getName(){
System.out.println("当前对象所在的类名称"+this.getClass().getName());
System.out.println(name);
}
}
public class Test
{
public static void main(String [] args){
Son s = new Son();
s.getName();
//检查son类的域
Field[] fields=s.getClass().getFields();
for(Field field:fields){
System.out.println(field.getName());
}
}
}


另外,这个this指向的对象是你创建的实际的类型的对象,并不一定是所在类的对象。
ZiSheng 2009-07-25
  • 打赏
  • 举报
回复

class Base
{
public String name = "base";
public void getName(){
System.out.println("当前对象所在的类名称"+this.getClass().getName());
System.out.println(name);
}
}
class Son extends Base
{
public String name = "son";
}
public class Test
{
public static void main(String [] args){
Son s = new Son();
s.getName();
//检查son类的域
Field[] fields=s.getClass().getFields();
for(Field field:fields){
System.out.println("属性名称:"+field.getName());
}
}
}
zqyang0124 2009-07-25
  • 打赏
  • 举报
回复
son继承自base也就继承了父类的属性和方法。如果son对父类的方法getName进行了重写,则s.getName()会调用son的方法。没有的话则调用父类的方法。
bigbug9002 2009-07-25
  • 打赏
  • 举报
回复
(这就能理解为什么子类中可以有两个name了)
bigbug9002 2009-07-25
  • 打赏
  • 举报
回复
这样来理解子类对父类继承:
在子类对象内部包含着一个父类子对象父类子对象是子类对象的一部分,两者有明确的界线(这就能理解为什么子类为什么可以为两个name了),但是父类子对象做为子类的一部分,子类可以直接访问父类子对象的每个可以访问的成员(有些成员是不可访问的,比如private的成员,虽然这些成员是存在于子类中的父类子对象中的),也可以通过super访问,通常情况下只有在有歧义时才通过super访问,也就是说,如果父类子对象的成员名在整个子类中是唯一的,可以直接访问。

注意,上面说的父类子对象只能存在于子类中。于一般的对象不同,所以叫它为子对象
[Quote=引用 16 楼 guilianlele 的回复:]
引用 15 楼 bigbug9002 的回复:

this出现在那个类里,this就指的那个类的对象。你的this出现在父类中,所以this指的是父类。
你平时写方法的内容时,一般情况下成员名字都是直接的写的,直接写的成员名等价于this.成员名。


可是这个getName() 明明是子类son 调用的呀
[/Quote]
guilianlele 2009-07-25
  • 打赏
  • 举报
回复
结贴了~
die_angle 2009-07-25
  • 打赏
  • 举报
回复
这一个函数的重写功能,只有当子类有一成员函数重写了父类的方法,在访问时才能访问本类的方法,这一点15楼说的很清楚了.
guilianlele 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bigbug9002 的回复:]

this出现在那个类里,this就指的那个类的对象。你的this出现在父类中,所以this指的是父类。
你平时写方法的内容时,一般情况下成员名字都是直接的写的,直接写的成员名等价于this.成员名。
[/Quote]

可是这个getName() 明明是子类son 调用的呀
bigbug9002 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guilianlele 的回复:]


像大家说的son调用的是base(父类)的getName函数,但此时getName中的this应为son的实例,所以应该返回son的name,为什么还是返回Base的name?
[/Quote]
this出现在那个类里,this就指的那个类的对象。你的this出现在父类中,所以this指的是父类。
你平时写方法的内容时,一般情况下成员名字都是直接的写的,直接写的成员名等价于this.成员名。
加载更多回复(28)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧