匿名内部类初始化问题

匿名内部类初始化问题

//创建一个接口 
public interface InnerClass {
//在接口中定义两个抽象方法
	public String getName();
	public int getAge();
}
public class OutClass {
	//定义一个获取姓名和年龄的方法 传入接口类型为返回值类型
	public InnerClass getInnerClass(final int age,final String name) {
	//返回接口实例
		return new InnerClass() { //匿名内部类
			int age_; //内部类属性
			String name_;
			{ //构造代码块初始化传入的参数age和name
				if(0<age&&age<200){
					age_=age;
					name_=name;
				}
			}
			//实现接口中获取name和age方法
			public String getName() {
				return name_;
			}
			public int getAge() {
				return age_;
			}
		}; //匿名内部类用封号结束大括号
	}
		
	public static void main(String[] args) {
		//实例化
		OutClass out=new OutClass();
		
		InnerClass in1=out.getInnerClass(201, "chenssy");
		InnerClass in2=out.getInnerClass(23, "ssychen");
		System.out.println(in1.getName());
		System.out.println(in2.getName());
	}
}
  1. 老师我的注释标的都对嘛?

  2. 这个匿名内部类在方法体内是不是也算方法内部类?方法体是return new InnerClass(){};吗?如果是的话为什么这部分不在括号内?

  3. 老师能不能具体讲一下这种匿名内部类的实现方式?与基本那种有什么区别?

  4. 如果要实现匿名内部类的初始化 能不能像之前那种格式呢?应该怎么改?

  5. 这个方法结构又是新的模式 要是自己写感觉会欠很多东西 但又不知道哪里不足 怎么办?可以把这段代码当模板吗?

正在回答 回答被采纳积分+1

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

3回答
好帮手慕酷酷 2019-11-22 16:03:28

同学你好,return这个关键字比较特殊,添加不添加括号都是可以的,因为通过调用getInnerClass方法,直接返回创建的匿名内部类对象,可以不需要括号也可以编写括号,同学特别记忆一下就可以了,在其他的匿名内部类编写时,建议都添加上。

同学在记忆时,可以统一都按照老师的结构进行记忆就可以啦。

如:

http://img1.sycdn.imooc.com//climg/5dd7941b0941245a06820508.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕酷酷 2019-11-21 19:55:10

同学你好,老师依次回答同学的问题:

1、对于第一个问题,同学的注释是正确的。

2、对于第二个问题,并不属于方法内部类,方法内部类是指在普通方法中定义的内部类,例如:

http://img1.sycdn.imooc.com//climg/5dd675ea09c4c7a410850686.jpg

3、对于第三个问题,匿名内部类也就是没有名字的内部类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。通常使用匿名内部类就相当于实现了接口或继承了父类。

实现方式:

(new 父类的构造方法或要实现的接口(){
匿名内部类的类体;
});

而普通成员内部类是指直接在一个类中,嵌套一个class类。如:

http://img1.sycdn.imooc.com//climg/5dd676b90989871408440504.jpg

4、对于第四个问题,匿名内部类的初始化,只可以通过构造代码块为匿名内部类创建一个构造器的效果。进行初始化属性值哦~

5、对于第五个问题,同学可以先将代码的模板背下来,然后多练多写,就可以巩固代码啦~

6、对于第六个问题,你的理解是正确的,因为这里年龄为201,不符合if的判断条件,也就无法将属性赋值给内部类的属性,所以输出为null。

如:

http://img1.sycdn.imooc.com//climg/5dd67ae4094a88f705410249.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 提问者 慕后端4084011 #1
    老师我还想问下 这个匿名内部类的方法体是return new InnerClass(){};吗?如果是的话为什么这部分不在括号内?之前的那个结构不是“(new 父类的构造方法或要实现的接口(){匿名内部类的类体;})”这样的吗?;
    2019-11-22 15:47:08
  • 好帮手慕阿莹 回复 提问者 慕后端4084011 #2
    同学你好,上边老师回答的有些错误, new InnerClass(){};不加() 是因为这个代码是方法体中的,而不是在参数中。那个() 其实是参数的()。祝学习愉快。
    2020-04-03 17:45:04
提问者 慕后端4084011 2019-11-21 18:28:37

6.最后输出结果第一行是null 是因为初始化条件中只要年龄不符合姓名也就不能返回传入的值吗?

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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