黑马程序员一内部类的改进思路

这篇博客探讨了内部类在Java编程中的应用,通过医生与病人手术的比喻,指出在使用内部类时可能遇到的问题。作者首先描述了错误的实现方式,即通过返回新的心脏对象导致操作错误。然后,尝试应用单例模式解决,但发现并不适合内部类。最后,提出在构造方法中初始化内部类对象的解决方案,确保每次获取到的是相同的心脏对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

今天又看到内部类,有点迷糊,专门写一篇博客来理清一下思路

我的假设是,医生,病人,医生给病人的心脏做手术

class person
{
	private String name;
	private String career;
	public String getName() {
		return name;
	}
	public String getCareer() {
		return career;
	}
	public person(String name, String career) {
		super();
		this.name = name;
		this.career = career;
	}	
}
class doctor extends person{
    private person p;
	public doctor(String name, String career) {
		super(name, career);
	}
	public void doOperation(patient c)
	{
		//打印出心脏
		System.out.println(c.getheart());
		//将心脏的状态设置为健康
		c.getheart().setState("Heathy");
		System.out.println(c.getheart());
	}	
}
关于病人定义,我有几条思路

思路一

病人提供一个返回他自己心脏的方法,当医生要给病人做手术时,他获得病人的引用,调用该方法来获取心脏,进而对其进行进一步的操作,这里的方法很简单,就是将他的状态设置为“Healthy”

class heart{
		private String color;
		private String state;
		public heart(String c,String s)
		{
			this.color=c;
			this.state=s;
		}
		public String getColor() {
			return color;
		}
		public String getState() {
			return state;
		}
		public void setColor(String color) {
			this.color = color;
		}
		public void setState(String s)
		{
			this.state=s;
		}
		public void beat()
		{
			System.out.println("I am beating!");
		}
	    @Override 
		public String toString()
		{
			return this.color+":"+this.state;
		}
	}


心脏类定义在病人中,为其内部类,病人有一个方法

getHeart()

{

  return new haert("Red","Not healthy");

}

这里我犯了一个错误,在doctor的doOperation中,需要多次调用这个方法,但是每次返回的却是不同的心脏,因为没有心脏的引用,所以导致我每次调用心脏的setState方法时,并不在我当初调用的那个心脏上,这是一个错误。

改正一

后来我想到了张孝祥老师的单例模式,即心脏他自己创建一个唯一的静态实例,并提供一个静态方法给病人,那么每次调用的就是同一个心脏了,但是这一方法令事情非常复杂,且该方法不适合用于内部类的结构,若是单独的建一个心脏类,是没有任何问题的。

改正二

当我结合实际来思考时,突然豁然开朗,一个人被创建的时候就应该有一个心脏,我们完全可以在构造方法中做这件事情,那么病人也可以对外提供一个获取自己心脏的方法,当时每次返回的绝对是同一个心脏

代码如下

class patient extends person{
	private heart h;
	public patient(String name, String career) {
		super(name, career);
	    h=new heart("Red","Not Healthy");	
	}
	public heart getheart()
	{
		return h;
	}
	
这样用起来不仅简单,而且容易举一反三,利用这样一种面向对象的思维,多多磨练就很容易找到解决一个实际问题的方法,这是最重要的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值