1.老师,为什么我常创建Personal的时候会报错?

1.老师,为什么我常创建Personal的时候会报错?

package com.imooc.people;
//外部类
public class Personal {
	int age;

	public Heart getHeart() {
		return new Heart();
	}
//成员内部类
	class heart()
	{

		public String beat() {
			return "心脏在跳动";
		}
	}
}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

new Heart().temp=12;其实是这行代码报错了,在成员变量定义的位置,定义一个变量可以,但是new Heart().temp=12;这个不是变量定义的语句了,所以不能写在这个地方。Java中的代码除声明语句外,其他要写到方法里。祝学习愉快!

  • Ironxi_work 提问者 #1
    那老师该如何修改为好,我在此处想表达的是外部类调用内部类的temp并为temp重新赋值;
    2018-01-29 20:56:02
  • 一叶知秋519 回复 提问者 Ironxi_work #2
    你好,可以将new Heart().temp=12;写到方法中,而不是写在定义成员变量的位置;如果想给内部类的temp并为temp重新赋值,可以再重新定义一个方法,在方法中完成属性的重新赋值。祝学习愉快~
    2018-01-30 11:00:40
  • Ironxi_work 提问者 #3
    非常感谢!
    2018-02-09 18:30:27
提问者 Ironxi_work 2018-01-28 20:48:22
已解决自己问的问题,现在问题如下:
想请教一下各位老师和大神,为何在Personal当中第四行报错:
代码如下:
package com.imooc.people;

//外部类
public class Personal {
	public int age =18;//为何此行报错?
	new Heart().temp=12;

	public Heart getHeart() {
		return new Heart();
	}

	public void eat() {
		System.out.println("人会吃东西 ");
	}

	/*
	 * 成员内部类 1.内部类在外部使用时,无法直接实例化,需要借助外部类实例化才能访问;
	 *  2.内部类的访问修饰符,可以任意,但访问权限会受到影响;
	 * 3.内部类的可以直接访问外部类的成员,如果出项同名属性,优先访问内部类中定义的; 
	 * 4.可以使用外部类中.this。成员的方式访问外部类当中同名的信息;
	 * 5.外部类访问内部类不能直接访问,需要通过new 内部类()。对象名;
	 * 6.内部类编译后.class文件命名:外部类$内部类。class;
	 */
	public class Heart {
		int age = 13;
		int temp = 223;

		public String beat() {
			return Personal.this.age + "岁的心脏在跳动";
			// 访问personal类中的成员;
		}
	}
}
package com.imooc.people;

public class PeopleTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Personal lili = new Personal();
		lili.age = 12;
		// 获取内部类的实例对象,方案一:new 外部类()。new 内部类();
		Personal.Heart myHeart = new Personal().new Heart();
		System.out.println(myHeart.beat());
		// 获取内部类的实例对象,方案二:外部类对象。new 内部类();
		 myHeart=lili.new Heart();
		 System.out.println(myHeart.beat());
		// 获取内部类的实例对象,方案三:外部类对象。获取方法;
		 myHeart=lili.getHeart();
		 System.out.println(myHeart.beat());
	}

}


  • 第4行报错,但是错误在第5行 new Heart().temp=12; 个人理解: 1、第5句在外部类里,类的下面应该是成员属性/方法, class{ 成员属性; 成员方法(); } 所以第5句写在这里系统将认为是成员属性,即声明属性,并实例化或赋值;new Heart().temp是实例化Heart,并调用Heart里的temp属性;声明是创建新的,但是调用不是,所以会报错。 2、如果调用temp,应该在方法内调用,所以设置成员方法getHeart(),然后把new Heart().temp=12;放到getHeart()里; 3、如果想在此处实例化,应作为成员属性,比如 Heart lili = new Heart(); 但是不能给内部类temp赋值,理由在第1条里说了,temp是调用,不是声明。但是可以int temp2 = new Heart().temp; 此处是声明了int变量temp,把实例化Heart里的temp值赋给外部类的temp2。
    2018-02-04 17:47:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师