黑马程序员--Java编程之匿名内部类

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

1 内部类

1.1 定义

将一个类定义在另一个类里面,里面的类便成为内部类
可以形象的将外部类比喻成人的身体,而内部类就是身体中的器官,比如心脏等

1.2 访问特点

内部类可以直接访问外部类的成员,也包括私有成员;
外部类要访问内部类,必须建立内部类对象。

1.3 内部类位置

内部类定义在成员位置上时可以被private,static修饰符修饰,但被static修饰的内部类只能访问外部类中的静态成员;
内部类定义在局部位置上时也可以直接访问外部类中的成员,同时也可以访问所在局部中的局部变量,但该变量必须是被final修饰的。

2 匿名内部类

2.1 定义

没有名字的类,其实就是内部类的简化写法,所以它也有内部类的特点,因为匿名内部类没有名字,所以只能使用一次,主要用来简化代码时使用。

2.2 前提

存在一个类或者接口;该类可以是具体类也可以是抽象类。

2.3 格式

    new 类名或者接口名(){
            重写方法;
        };

2.4 举例

2.4.1 例1

使用继承来实现抽象方法:

//写一个Student类
abstract class Student{
    void study(){};
}
//写一个子类继承Student类
class StudentA extends Student{
    //重写父类方法
    public void study(){
        System.out.println("学习Java");
    }
}
public class Demo{
    public static void main(String[] args){
        Student stu = new StudentA();
        stu.study();//运行结果:学习Java
    }
}

通过以上举例可以看出,我们只想调用一次Student类中的方法,以后便不再使用,却单独创建了一个子类,这样是不是很麻烦,为了优化代码,节省资源,我们可以使用匿名内部类解决改问题

2.4.2 例2

使用匿名内部类实现抽象方法

//写一个Student类
abstract class Student{
    void study(){};
}
public class Demo{
    public static void main(String[] args){
        //使用匿名内部类调用抽象方法
        Student stu = new Student(){
            public void study(){
                System.out.println("学习Java");
            }
        };
        stu.study();//运行结果:学习Java
    }
}

由上例我们可以看出匿名内部类的加入使得我们少书写了一个Student类的子类,直接在大括号中调用了抽象类的抽象方法
匿名内部类不仅可以使用于抽象类,也可以使用在接口上

2.5 经典面试题

题目要求:根据下面代码,补充缺少的代码,使完整的代码可以在控制台输出“HelloWorld”

Interface Inter{
    void show();
}
class Outer{
//补齐代码
}
public class Demo{
    public static void main(String[] args){
        Outer.method().show();
    }
}

解析:

Interface Inter{
    void show();
}
class Outer{
    //代码实现
    public static Inter method(){
        return new Inter(){
            public void show(){
                System.out.println("HelloWorld");
            }
        };
    }
}
public class Demo{
    public static void main(String[] args){
        Outer.method().show();
        /*
        1.由Outer.method()语句可以看出Outer类可以直接调方法,
        说明该类中存在静态方法method();
        2.由Outer.method().show();语句可以看出,method方法还可
        以调方法show(),说明method()方法存在返回值,并且该返回
        值是一个对象
        3.method()调用的是show()方法,说明其返回值是一个Inter对
        象,因为只有Inter接口中才有show()方法
        */
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值