用 引用.方法名 可以调用重写的方法,但为什么无法用 p.name 来调用相应对象的属性?怎么修改?求大佬告知

SuperMonkey3306 2020-04-17 09:45:12
我的疑问在主人的eat方法处,用 引用.方法名 可以调用重写的方法,但为什么无法用 p.name 来调用相应对象的属性?怎么修改?求大佬告知
```
/*
* 此程序是为了练习多态,
* 需要程序输出结果:“主人”正在给宠物喂食 “宠物”正在吃东西。
*
* 但是我的程序输出结果却是:
*
*
张三正在给null喂食
猫正在吃东西。

张三正在给null喂食
狗正在吃东西。

张三正在给null喂食
鹦鹉正在吃东西。
*/
public class Test03 {
public static void main(String[] args){
Master zhangSan = new Master("张三");
Pet dog = new Dog();
Pet cat = new Cat();
Pet yiWu = new YingWu();
zhangSan.feed(cat);
zhangSan.feed(dog);
zhangSan.feed(yiWu);


}
}
/*
* 主人类
*/
class Master{
private String name;

public Master(){

}

public Master(String name){
this.name = name;
}

public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}

/*
* 我的疑问在此处,用 引用.方法名 可以调用重写的方法,但为什么无法用 p.name 来调用相应对象的属性?怎么修改?求大佬告知
*/
public void feed(Pet p){
System.out.println(this.name + "正在给" + p.name + "喂食");
p.eat();

}
}
/*
* 宠物父类
*/
class Pet{
String name;
public void eat(){
}

}
class Dog extends Pet{
String name = "狗";
public void eat(){
System.out.println(name+ "正在吃东西。");
};
}
class Cat extends Pet{
String name = "猫";
public void eat(){
System.out.println(name+ "正在吃东西。");
};
}
class YingWu extends Pet{
String name = "鹦鹉";
public void eat(){
System.out.println("鹦鹉正在吃东西。");
}
}
...全文
196 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2020-04-21
  • 打赏
  • 举报
回复
引用 楼主 BLACK BUTCHER 的回复:
我的疑问在主人的eat方法处,用 引用.方法名 可以调用重写的方法,但为什么无法用 p.name 来调用相应对象的属性?怎么修改?求大佬告知
既然知道可以方法覆盖,那么还是要用到方法覆盖。 Pet类和Dog中添加set,get方法,这样可以用dog类中的getName方法来覆盖Pet的方法。

public class Pet {
	String name;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void eat() {};
}

public class Dog extends Pet {
	String name="狗";

	public String getName() {
		// TODO Auto-generated method stub
		return this.name;
	}

	public void setName(String name) {
		// TODO Auto-generated method stub
		this.name=name;
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println(name+"正在吃东西");
	}
}
Master 类的 feed方法改为一下:

public void feed(Pet p) {
		System.out.println(this.name+"正在给"+p.getName()+"喂食");
		p.eat();
	}
cfbs168 2020-04-19
  • 打赏
  • 举报
回复
引用 5 楼 cfbs168 的回复:
由于父类已经定义name(String name;),子类没有必要再定义name,直接引用name就行了,建议把所有子类的:String name=“XX";这句里面的String去掉就行了。否则你就是在子类定义了同名的成员变量,那么变量p的类型是父类:Pet,则p.name引用的是父类的name。

而父类的name并没有赋值,所以其值为null,输出自然是null。
cfbs168 2020-04-19
  • 打赏
  • 举报
回复
由于父类已经定义name(String name;),子类没有必要再定义name,直接引用name就行了,建议把所有子类的:String name=“XX";这句里面的String去掉就行了。否则你就是在子类定义了同名的成员变量,那么变量p的类型是父类:Pet,则p.name引用的是父类的name。
辉酱OvO 2020-04-17
  • 打赏
  • 举报
回复
关于多态,你可以记住一句口则: 对于非静态的成员方法,编译看左边,运行看右边,其他都是编译看左边,运行看左边。 怎么去理解这句话呢 对于你这个题目,将Dog作为参数传入feed方法时,我们可以看成 Pet p=new Dog();开始使用我上面的口则 p.name,是成员变量,不是方法。编译看左边,运行看左边,也就是都对应Pet p的值,p中name没有初始化,默认值为null p.eat(),是成员方法,而且是非静态的。编译看左边,运行看右边。运行时运行的是new Dog()的eat方法,自然输出的是狗在吃东西(你可能会问,为什么这个System.out.println(name+ "正在吃东西。");这里的name是狗而不是null呢?注意,上面说的编译看左边什么的,都是多态时候的判断方法,进入方法内部,这个变量不再用口则判断,而是就近原则。你可以理解为,方法内部引用的变量都是来源于本方法的调用类)
SuperMonkey3306 2020-04-17
  • 打赏
  • 举报
回复
引用 1 楼 sunyiz的回复:
这是面向对象中的一个基本原则:
“子类中的同名方法可以覆盖父类中的非private同名方法;
但是子类中的同名变量,不可覆盖父类中的同名变量”
意思就是覆盖只覆盖方法,与变量无关,懂了,谢谢
sunyiz 2020-04-17
  • 打赏
  • 举报
回复
这是面向对象中的一个基本原则:
“子类中的同名方法可以覆盖父类中的非private同名方法;
但是子类中的同名变量,不可覆盖父类中的同名变量”
SilentHunter460 2020-04-17
  • 打赏
  • 举报
回复
你需要在Dog、Cat、YingWu这三个类里,分别做无参构造方法,内容是 super.name = name, 就可以实现你的目标了。
内容概要:本文介绍了基于MATLAB实现的PSO-KNN多特征分类预测项目,通过将粒子群优化算法(PSO)与K近邻算法(KNN)相结合,解决传统KNN在高维多特征数据分类中面临的参数敏感、特征冗余、分类精度低等问题。项目采用PSO对KNN的关键参数(如K值和特征权重)进行全局寻优,结合数据预处理、特征加权选择、适应度评估与并行化机制,构建了一个高效、自适应的智能分类模型。文中详细阐述了模型架构的各个层级,包括数据预处理、特征加权、参数寻优、粒子群协作策略及分类输出,并提供了部分MATLAB代码示例,涵盖主成分分析、粒子初始化、速度更新、交叉验证与结果可视化等关键步骤。; 适合人群:具备一定机器学习基础和MATLAB编程能力,从事数据分析、智能算法研究或工程应用的研发人员、高校研究生及科研工作者,尤其适合关注智能优化与分类预测融合应用的人员。; 使用场景及目标:①应用于医学诊断、金融风控、工业监测等需要高精度多特征分类的领域;②解决KNN算法在高维数据中的参数选择与特征权重优化难题;③提升分类模型的自动化程度与泛化能力,减少人工调参成本;④为智能算法集成与实际工程落地提供可复用的技术框架。; 阅读建议:此资源以实际项目为导向,结合理论与代码实现,建议读者在理解算法原理的基础上,运行并调试所提供的MATLAB代码,重点关注PSO寻优过程与KNN分类的耦合机制,同时可根据自身数据特点调整适应度函数与参数范围,实现模型迁移与优化。

62,625

社区成员

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

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