一 内部类的基本定义方式
package NestedClass;
/**
* 测试内部类的基本定义方式
* @author lenovo
*
*/
public class Demo01 {
//静态内部类
private static class StaticNestedClass {
}
//普通内部类(成员内部类)
private class FierldInnerClass {
}
void sayHello() {
//方法内部类(局部内部类)
class LocalClass {
}
//匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
}
}
二 内部类的详细用法
package NestedClass;
/**
* 测试静态内部类的详细用法
* @author lenovo
*
*/
public class Demo02 {
Outer02.StaticInnerClass osic = new Outer02.StaticInnerClass();//在不相关的类中引用内部类
}
class Outer02 {
int c = 5;
static int d = 10;
//静态内部类
public static class StaticInnerClass {
int a = 2;
static int b = 4;
public void test() {
System.out.println(d);
// System.out.println(c); // 静态内部类中是不能调用外部类的不同成员的!只能调用静态成员
}
}
}
三 成员内部类的基本用法
package NestedClass;
public class Demo03 {
public static void main(String[] args) {
Outer03 out = new Outer03();//成员内部类对象的创建,必须先有外部类对象!
Outer03.InnerClass ic = out.new InnerClass();
ic.test();
}
}
class Outer03 {
private int a = 3;
int b = 10;
// 成员内部类
class InnerClass {
int d = 1;
// static c = 10; //成员内部类中不能有静态成员或者静态的方法
void test() {
System.out.println(a);//成员内部类可以访问外部类的所有成员(包含privatede)
System.out.println(b);
System.out.println("内部类对象:" + this); //成员内部类对象的创建,必须先有外部类对象!
System.out.println("外部类对象:" + Outer03.this); //引用了外部类的对象!
}
}
}
四 方法里的内部类(局部内部类)
package NestedClass;
/**
* 测试方法内部类(局部内部类)
*
* @author lenovo
*
*/
public class Demo04 {
}
class Outer04 {
public void test() {
int a = 3;
class Inner {
int b = 10;
// static int c = 20; //在方法的内部类中只能定义非静态成员
void tt() {
System.out.println(a);
}
}
}
}
五 方法里的匿名内部类
package NestedClass;
/**
* 方法里的匿名内部类
* @author lenovo
*
*/
public class Demo05 {
public static void main(String[] args) {
Outer05 out = new Outer05();
out.test();
}
}
class Outer05 {
public void test02(Car c) {
c.run();
}
public void test() {
//匿名内部类(new了一个没有名字的实现类,接口式),由于本类定义在方法中,也是方法的内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
//匿名内部类继承式
Car car = new Car() {
@Override //重写run()方法
public void run() {
System.out.println("子类的车跑");
}
};
car.run();
//参数式匿名类
test02(new Car() {
@Override
public void run() {
System.out.println("参数式匿名内部类车在跑!");
}
});
}
}
class Car {
public void run() {
System.out.println("汽车跑!");
}
}