求教JAVA基础继承问题!!!

bigdogLIU 2018-05-21 08:57:43
package test;
class people{
private String name="people";
public void speak() {
System.out.println(this.getClass().toString()+" name="+name);
}
}
class man extends people{
String name="man";
}
class baby extends man{
String name="baby";

}

public class test {
public static void main(String[] args) {
people p=new people();
man m=new man();
baby b=new baby();
p.speak();
m.speak();
b.speak();
}
}
运行结果:
class test.people name=people
class test.man name=people
class test.baby name=people



Java中的继承不是子类拥有父类非private的属性和方法么,为什么子类中输出的还是父类name定义的“people”呢?
...全文
1513 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
stacksoverflow 2018-06-11
  • 打赏
  • 举报
回复
java虚拟机的方法表中存储该类所具有的所有方法,包括继承来的方法。 每个方法有一个指向方法数据的指针,也就是父类的方法则指向父类的数据。 所以实际调用的方法是该类拥有的方法(包括继承来的方法),但方法访问的数据则是该方法指向的数据(继承来的方法指向继承来的数据)
szjeff2016 2018-06-10
  • 打赏
  • 举报
回复
你调用的是父类的方法,父类的方法当然是调自己的属性了,而且它也不能直接访问子类的属性
千沤 2018-06-10
  • 打赏
  • 举报
回复
[quote=引用 6 楼 limoxin_ 的回复:] 没错,子类是继承了父类的方法,但那依然是父类的方法,子类只是获得了使用的权力,想要输出子类的自己的name,就得把speak方法变成是子类自己的,所以需要覆盖speak方法来变成子类自己的

class People{
	private String name = "people";
	public void speak() {
		System.out.println(this.getClass().toString()+"  name = "+name);
	}
}
class Man extends People{
	String name = "man";
	public void speak() {
		System.out.println(this.getClass().toString()+"  name = "+name);
	}
}
class Baby extends People{
	String name = "baby";
	public void speak() {
		System.out.println(this.getClass().toString()+"  name = "+name);
	}
}
public class Test {

	public static void main(String[] args) {
		People p = new People();
		Man m = new Man();
		Baby b = new Baby();
		p.speak();
		m.speak();
		b.speak();

	}

}
输出结果: [code=java]class limoxin.People name = people class limoxin.Man name = man class limoxin.Baby name = baby
Cyank-I 2018-06-08
  • 打赏
  • 举报
回复
子类继承父类,子类拥有了父类的所有属性和方法。
csdn_senior_fans 2018-06-07
  • 打赏
  • 举报
回复
顶顶顶顶顶顶。
abolom 2018-06-07
  • 打赏
  • 举报
回复
简单地说,因为你没有重写父类中的speak方法,所以子类对象调用父类方法时,还是会使用父类的私有成员
s随心的风 2018-06-06
  • 打赏
  • 举报
回复
调用了父类的方法,父类的方法调用父类中的属性。如果子类调用的方法,在本类中找不到时,就会往上查找。
虫二飞呀 2018-06-05
  • 打赏
  • 举报
回复
方法都没有重写,怎么实现子类功能??
凤山老林 2018-06-01
  • 打赏
  • 举报
回复
你这里虽然子类对父类的name属性覆盖了,但是speak()方法没有覆盖,这样就造成你通过子类对象调用父类的speak()方法,父类的方法中输出的name属性便是父类的name属性。你需要在子类中重写speak()方法才能有你想要的结果。 如下代码: package com.lin.helloworld; class people{ private String name="people"; public void speak() { System.out.println(this.getClass().toString()+" name="+name); } } class man extends people{ String name="man"; public void speak() { System.out.println(this.getClass().toString()+" name="+name); } } class baby extends man{ String name="baby"; public void speak() { System.out.println(this.getClass().toString()+" name="+name); } } public class Test { public static void main(String[] args) { people p=new people(); man m=new man(); baby b=new baby(); p.speak(); m.speak(); b.speak(); } }
qq_29152633 2018-05-31
  • 打赏
  • 举报
回复
当子类属性覆盖父类的属性时打印父类的属性的值
欣赏月光 2018-05-30
  • 打赏
  • 举报
回复
方法和变量都是父类的,子类不能访问private,调用speak就是调用父类的方法。
YGLeeeon 2018-05-29
  • 打赏
  • 举报
回复
父类的方法不能访问子类的成员。虽然数据成员的名字一样但是是在不同的域里的不同的变量,父类的方法引用的都是父类的成员变量。
qq_26813141 2018-05-28
  • 打赏
  • 举报
回复
继承父类的所有方法和属性,只是私有的子类无法访问
ijwddd 2018-05-28
  • 打赏
  • 举报
回复
我觉得你这个是java里面的就近原则,因为你是在父类中定义输出方法的,而且你是直接+name输出的
书呆子Eric 2018-05-23
  • 打赏
  • 举报
回复
子类继承父类的方法,对父类方法中的变量和方法只有使用权,没有修改权,因为调用的是父类的方法,自然是输出父类方法中定义的变量,如果要想输出子类的变量,就需要覆盖父类中的方法,这样就会优先调用子类的方法。
卡布奇诺er 2018-05-23
  • 打赏
  • 举报
回复
super.speak();是调用的父类自己的方法
  • 打赏
  • 举报
回复
调用的是父类对象中的speak方法,父类对象是访问不到子类的name属性的,所以其实访问的还是子类继承父类的name属性,相当于super.name,super.name还是people
yjsl__ 2018-05-22
  • 打赏
  • 举报
回复
private的东西也能继承,但是子类中不能访问,可以通过调用父类的方法访问

package question.one;

class people {
	private String name = "people";

	public void speak() {
		System.out.println(this.getClass().toString() + "    name=" + this.name);
	}
}

class man extends people {
	public void speak() {
		super.speak();
	}
}

class baby extends man {
	public void speak() {
		super.speak();
	}

}

public class test {
	public static void main(String[] args) {
		people p = new people();
		man m = new man();
		baby b = new baby();
		p.speak();
		m.speak();
		b.speak();
	}
}
qq_38814020 2018-05-22
  • 打赏
  • 举报
回复
子类是继承了父类的方法,但那依然是父类的方法,子类只是获得了使用的权力,想要输出子类的自己的name,就得把speak方法变成是子类自己的,所以需要覆盖speak方法来变成子类自己的
limoxin_ 2018-05-22
  • 打赏
  • 举报
回复
没错,子类是继承了父类的方法,但那依然是父类的方法,子类只是获得了使用的权力,想要输出子类的自己的name,就得把speak方法变成是子类自己的,所以需要覆盖speak方法来变成子类自己的

class People{
	private String name = "people";
	public void speak() {
		System.out.println(this.getClass().toString()+"  name = "+name);
	}
}
class Man extends People{
	String name = "man";
	public void speak() {
		System.out.println(this.getClass().toString()+"  name = "+name);
	}
}
class Baby extends People{
	String name = "baby";
	public void speak() {
		System.out.println(this.getClass().toString()+"  name = "+name);
	}
}
public class Test {

	public static void main(String[] args) {
		People p = new People();
		Man m = new Man();
		Baby b = new Baby();
		p.speak();
		m.speak();
		b.speak();

	}

}
输出结果:
class limoxin.People  name = people
class limoxin.Man  name = man
class limoxin.Baby  name = baby
加载更多回复(4)

62,616

社区成员

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

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