您的位置:首页 > 职场人生

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

2015-12-06 00:23 274 查看
——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()方法
*/
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 编程