内部类
一、属性
- 1.在类中又声明一个类,该类为内部类。
- 2.在内部类中可以直接访问到外部类中的成员属性(包括私有属性)。
- 3.外部类如果想要访问到内部类里面的属性,就必须创建内部类对象。
-
二、分类
-
1.成员内部类
创建对象:
1.先创建外部类的对象,使其加载内部类
2.外部类的对象.new 成员内部类名();
public class OuterClass {
//成员变量
private String name;
//静态变量
static int i;
//成员方法
public void test(){
}
//成员内部类:可以声明成员变量、成员方法,不能写main方法。随着对象加载而加载
class InnerClass{
int i;
public void test(){
System.out.println("成员内部类");
System.out.println(name);
System.out.println(i);
}
}
public static void main(String[] args) {
//1.创建外部类对象
OuterClass outer = new OuterClass();
//2.创建成员内部类对象
InnerClass inner = outer.new InnerClass();
inner.test();//调用的是内部类中的test()方法
}
}
2.静态内部类
创建对象
1.new 静态内部类名();
public class OuterClass {
//成员变量
private String name;
//静态变量
static int i;
//成员方法
public void test(){
}
//静态内部类:可以有main方法。随着类加载而加载
static class StaticClass{
public void test(){
System.out.println("静态内部类");
}
public static void main(String[] args) {
//创建静态内部类对象
StaticClass sc = new StaticClass();
sc.test();
}
}
}
3.局部内部类
创建对象:
1.在方法(包括main方法)中,通过new创建对象
class 类名{......}
public class OuterClass2 {
public void test() {
//局部变量
int i = 1;
//局部内部类
class InnerClass {
int i;
public void method() {
System.out.println("局部内部类");
}
}
//创建局部内部类对象
InnerClass inner = new InnerClass();
inner.method();
}
public static void main(String[] args) {
new OuterClass2().test();
}
}
4.匿名内部类
创建对象
- 1.在方法(包括main方法)中
- new 类名(){ //该类名不是匿名类的名字,是其继承的父类的类名
- @Override
- ....(重写的方法)
- };
abstract public class Test {
abstract void test();
abstract void test2();
}
public interface Test2 {
void login();
void register();
}
public class OuterClass3 {
public static void main(String[] args) {
//创建了抽象的Test类的匿名的内部子类
//相当于底层自动创建了一个名字为null的子类,继承了Test类
Test t = new Test(){
@Override
void test() {
System.out.println("测试");
}
@Override
void test2() {
System.out.println("测试2");
}
};
t.test();
t.test2();
//创建接口的匿名实现类
Test2 t2 = new Test2(){
@Override
public void login() {
System.out.println("登录");
}
@Override
public void register() {
System.out.println("注册");
}
};
t2.login();
t2.register();
}
}