求教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”呢?
...全文
1538 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
方法都没有重写,怎么实现子类功能??
夸父CV 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)
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文中,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的类,而那些类里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的类创建新类的过程,现有的类称作基类(或父类),创建的新类称作派生类(子类)。继承其实就是自动地共享基类中成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型类型的限定 3.反射 代码概述: bean :Person.java 这个人员类我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个类操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zylyueliang/archive/2010/09/17/5890043.aspx
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文中,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的类,而那些类里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的类创建新类的过程,现有的类称作基类(或父类),创建的新类称作派生类(子类)。继承其实就是自动地共享基类中成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型类型的限定 3.反射 代码概述: bean :Person.java 这个人员类我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个类操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zylyueliang/archive/2010/09/17/5890043.aspx

62,635

社区成员

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

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