普通内部类
- 外部类不能访问普通内部类属性和方法
- 普通内部类可以访问外部类属性和方法
- 创建普通内部类的时候必须创建外部类
静态内部类
- 静态内部类可以访问外部类静态属性和方法
- 静态内部类不能访问外部类非静态属性和方法
- 外部类不能访问静态内部类的属性和方法
示例代码:
public class A {
private Integer a;
private static Integer s = 10;
public A() {
}
public A(Integer a) {
this.a = a;
}
public void funA1() {
System.out.println(a);
// 外部类不能访问内部类属性
System.out.println(aa);
}
public void funA2() {
// 外部类不能访问内部类方法
funAA1();
}
public static void funA3() {
System.out.println(s);
}
// 普通内部类
protected class AA {
private Integer aa;
public AA() {
}
public AA(Integer aa) {
this.aa = aa;
}
public void funAA1() {
// 内部类能访问外部类属性
System.out.println(a);
System.out.println(aa);
}
public void funAA2() {
// 内部类能访问外部类方法
funA1();
}
}
// 静态内部类
protected static class BB {
private static Integer ss = 100;
private Integer bb;
public void funBB1() {
// 内部类能访问外部类静态属性
System.out.println(s);
System.out.println(ss);
// 内部类不能访问外部类非静态属性
System.out.println(a);
}
public void funBB2() {
// 内部类静态方法不能访问外部类非静态方法
funA1();
// 内部类静态方法能访问外部类静态方法
funA3();
}
}
}
内部类实现多继承
示例代码:
public abstract class House {
protected void keeping() {
System.out.println("我是房子,我可以遮风挡雨!!!");
}
}
public abstract class Person {
public void doing() {
System.out.println("我是人,我可以做任何事!!!");
}
}
public class kitchen extends House {
private Cooker cooker;
public kitchen() {
this.cooker = new Cooker();
}
private void kitchenware() {
System.out.println("我是厨房,我可以提供厨具!!!");
}
public void cooking() {
this.cooker.cooking();
}
protected class Cooker extends Person {
void cooking() {
keeping();
kitchenware();
doing();
System.out.println("我是厨师,有了房子和厨具,我可以做饭!!!");
}
}
}
测试代码:
public class Test {
public static void main(String[] args){
A.AA aa = new A(1).new AA(2);
aa.funAA1();
aa.funAA2();
kitchen kitchen = new kitchen();
kitchen.cooking();
}
}