匿名内部类初始化问题

匿名内部类初始化问题

1
2
3
4
5
6
//创建一个接口 
public interface InnerClass {
//在接口中定义两个抽象方法
    public String getName();
    public int getAge();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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、对于第三个问题,匿名内部类也就是没有名字的内部类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。通常使用匿名内部类就相当于实现了接口或继承了父类。

实现方式:

1
2
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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