一.内部类
把类定义在其他类的内部,这个类就叫做内部类。
- 根据内部类,定义位置的不同,又分为成员内部类和局部内部类
- 成员内部类:内部类位于外部类的成员位置
- 局部内部类:内部类位于外部类的成员方法内
举例:
class A{
//成员内部类:位于外部类的成员位置
class B{
}
public void show(){
//局部内部类,位于外部类成员方法内
class C{
}
}
}
1.成员内部类
-
成员内部类的访问特点
-
内部类可以直接访问外部类的成员,包括私有的。
-
外部类要访问内部类的成员,必须创建内部类对象
-
可以在外部直接创建内部类对象,格式
-
外部类名.内部类名 对象名=new 外部类().new 内部类()
-
注意
-
类不可以私有化,但是内部类可以(经常采用的就是私有化内部类,外部间接访问的形式,保证数据的安全性)
-
内部类可以使用static修饰,称为静态内部类,其只能访问外部类的静态成员(方便访问数据)
-
外界直接创建静态内部类的格式
-
Wai.Nei a=new Wai.Nei();
举例:
public class 内部类的访问特点 {
public static void main(String[] args) {
//可以在外部直接创内部类的对象
Outer.Inner inner1=new Outer().new Inner();
inner1.neishow();
Outer outer=new Outer();
outer.waishow();
}
}
class Outer{
int num=100;
private int a=200;
class Inner{
int b=300;
public void neishow(){
System.out.println(b);
//内部类可以发访问外部类的成员,包括私有成员
System.out.println(num);
System.out.println(a);
waishow1();
}
public void neitest(){
System.out.println("内部类方法执行");
}
}
public void waishow(){
System.out.println("外部的show方法执行");
//外部类访问内部类的成员,必须创建内部类的对象
Inner inner=new Inner();
//通过内部类对象,访问内部类的成员变量
System.out.println(inner.b);
//通过内部类对象,访问内部类的成员方法
inner.neitest();
}
private void waishow1(){
System.out.println("外部类私有方法执行");
}
}
2.局部内部类
- 局部内部类的访问特点
- 可以直接访问外部类的成员
- 可以创建内部类对象,通过对象调用内部类方法,来使用内部类功能
- 局部内部类访问局部变量必须是final修饰
举例:
public class 局部内部类 {
public static void main(String[] args) {
int a=100;
int b=200;
Outer outer=new Outer();
outer.waishow(100,200);
}
}
class Outer{
private int num=20;
public void waishow(final int a,final int b){
//该局部变量需要使用final修饰
final int num1=30;
//局部内部类定义在成员方法内
class inner{
public void neishow(){
num=40;
System.out.println(num);
System.out.println(num1);
System.out.println(a+":"+b);
}
}
//创建内部类对象,调用内部类功能
inner x = new inner();
x.neishow();
}
}
3.匿名内部类
就是局部内部类的简化写法。
-
前提:存在一个类(可以是抽象类)或接口;格式:
new 类名或者接口名(){
重写方法;
} ; -
本质:继承该类或实现该接口的子类匿名对象
举例:
//抽象类
abstract class AbstractClass{
public abstract void show();
}
class Outer1{
public void method(){
//创建抽象类的子类的匿名对象
new AbstractClass(){
@Override
public void show() {
System.out.println("shoshowshow");
}
};
}
}
//接口
public interface MyInter{
public abstract void show();
}
class Outer{
public void method(){
new MyInter(){
@Override
public void show() {
System.out.println("showshowshow");
}
};
}
}