内部类的学习
一、内部类概念
- 在一个类中定义一个类
- 内部类分为:成员内部类,局部内部类和匿名内部类
二、内部类的访问特点
-
内部类可以直接访问外部类的成员,包括私有。
-
外部内要访问内部内成员,需要创建对象,使用对象来访问。
-
若内部类被static修饰,外部类可以使用类名访问被static修饰的成员变量与方法;而没有没static修饰的成员变量与方法只能通过创建对象来访问。
三、成员内部类
- 形式:
public class Test1 {
public class Test2 { //Test2为成员内部类
}
}
- 成员内部类的使用,格式:外部类名.内部类名 对象名 = new 外部类对象.内部类对象
eg:Test1.Test2 t2 = new Test1().Test2();
四、局部内部类
- 形式:
public class Test1 {
public void method(){
class Test2{ //定义在外部类的方法里面的类称为局部内部类
}
}
}
- 局部内部类的使用:通过执行外部类方法,给出局部内部类的定义以及对象创建,并使用。
//定义局部内部
public class Test1 {
public void method(){
class Test2{
public void show(){
System.out.println("test2");
}
}
Test2 t2 = new Test2();
t2.show();
}
}
//使用
Test1 t1 = new Test1();
t1.method();
五、匿名内部类
- 前提:存在一个类或接口,类可以是具体类也可以是抽象类
- 本质:匿名内部类是一个继承了该类或实现了该接口的子类匿名对象
- 格式:
new 类名或接口名(){
重写方法()
};
- 例子:
//定义一个接口
public interface Inter {
public abstract void show();
}
//定义一个类,在方法中实现内部类的使用,此方法适合单次使用
public class Test1 {
public void method(){
new Inter(){
@Override
public void show() {
System.out.println("Inter");
}
}.show(); //不加.show()仅仅是一个定义,无法使用,注意;一直都有
}
}
//创建外部类对象,调用方法执行内部内方法
Test1 t1 = new Test1();
t1.method();
//匿名内部类除了使用.方法名()之外,还可以通过多态创建对象使用,此方法适合多次调用
public class Test1 {
public void method(){
Inter i = new Inter(){
@Override
public void show() {
System.out.println("Inter");
}
};
i.show();
}
}
- 使用技巧:当需要实现接口时,不用每次都创建一个对象,可以直接使用匿名内部类传参
-方法一:创建对象传参
//定义一个接口
public interface Inter {
public abstract void show();
}
//定义一个操作类使用接口函数
public class Test1 {
public void method(Inter i){
i.show();
}
}
//定义一个类实现接口
public class Test2 implements Inter{
@Override
public void show() {
System.out.println("test2");
}
}
//使用操作类执行接口函数
Test1 t1 = new Test1();
t1.method(new Test2());
-方法二:使用内部类传参
//定义一个接口
public interface Inter {
public abstract void show();
}
//定义一个操作类使用接口函数
public class Test1 {
public void method(Inter i){
i.show();
}
}
//使用操作类执行接口函数
Test1 t1 = new Test1();
t1.method(new Inter() {
@Override
public void show() {
System.out.println("Inter");
}
});