一、 Java内部类分类:
1.非静态成员内部类:
内部类没有使用static关键字修饰,并且和外部类的成员变量和方法属于同一级别,这样的是非静态成员内部类(可以使用权限修饰符修饰,和final、abstract关键字修饰)。
public class Atest {
private String name = "张三";
//类没有用static修饰
class Btest{
public void say(){
System.out.println("我是非静态成员内部类");
}
}
}
2.静态成员内部类:
内部类使用static关键字修饰,并且和外部类的成员变量和方法属于同一级别,这样的是静态成员内部类(可以使用权限修饰符修饰,和final、abstract关键字修饰)。
public class Atest {
public static String name = "张三";
public String age = "23";
static class Btest{
public void say(){
System.out.println("外部成员变量,name = " + name);
System.out.println("我是静态成员内部类");
// 不可以调用非静态
// System.out.println("外部成员变量,age = " + age);
}
}
}
3.局部内部类:
定义在一个类的成员方法、代码块、构造器内部的类,这样的类成为局部内部类(不能使用权限修饰符修饰局部内部类)。
public class Atest {
public void execute(){
class Dtest{
}
}
}
4.匿名内部类:
匿名内部类是没有类名的类,是特殊的局部内部类。
(匿名内部类需要实现接口或是继承一个抽象类,此外匿名内部类不能定义构造器,因为是匿名)
局部内部类实现接口:
public class Atest {
public static String name = "张三";
public String age = "23";
public void execute(){
class MyInterface implements TestInterface{
@Override
public void play() {
System.out.println(name + "在打篮球");
}
}
}
}
interface TestInterface{
void play();
}
可以简化成匿名内部类:
public class Atest {
public static String name = "张三";
public String age = "23";
public void execute(){
TestInterface myInterface = new TestInterface(){
@Override
public void play() {
System.out.println("这是匿名内部类");
}
};
myInterface.play();
}
}
interface TestInterface{
void play();
}
二、 内部类如何实例化:
1.实例化非静态成员内部类:
public class Atest {
public static String name = "张三";
public String age = "23";
class Btest{
public void say(){
System.out.println("测试非静态成员内部类实例化");
}
}
}
public class MainTest {
public static void main(String[] args) {
//非静态成员内部类实例化
//1.实例化外部类
Atest atest = new Atest();
//2.实例化内部类
Atest.Btest btest = atest.new Btest();
btest.say();
}
}
2.实例化静态成员内部类:
public class Atest {
public static String name = "张三";
public String age = "23";
static class Ctest{
public void say(){
System.out.println("测试静态成员内部类实例化");
}
}
}
public class MainTest {
public static void main(String[] args) {
//静态成员内部类实例化
Atest.Ctest ctest = new Atest.Ctest();
ctest.say();
}
}
三、 内部类如何调用外部类属性与方法:
public class Atest {
public static String name = "张三";
public String age = "23";
class Btest{
public String age = "22";
public void say(String age){
System.out.println("我是输出的形参参数,age = " + age);
System.out.println("我是输出的Btest类成员变量,age = " + this.age);
System.out.println("我是输出的Atest类成员变量,age = " + Atest.this.age);
}
}
}
执行主方法:
public class MainTest {
public static void main(String[] args) {
//静态成员内部类实例化
Atest atest = new Atest();
Atest.Btest btest = atest.new Btest();
btest.say("18");
}
}
输出结果:
我是输出的形参参数,age = 18
我是输出的Btest类成员变量,age = 22
我是输出的Atest类成员变量,age = 23