关于内部类的一些测试
内部类的一些测试,结论如下,代码中也有相应注释
- 内部类和普通类一样都可以继承其他类或者实现接口
- 静态内部类属于外部类
- 非静态内部类属于外部类对象
- 内部类可以嵌套
- 外部类的派生类会继承其内部类以及内部类中的一切
- 静态内部类不可以访问外部类实例(因为它属于外部类本身),但可以访问外部静态属性,非静态内部类都可以(属于外部类对象)
- 非静态内部类不能有静态成员(静态方法,静态成员变量,静态初始化块)
- 外部类不可以访问内部类的实现细节
- 内部类可以使用4种修饰符:public ,private,protected,static,外部类只可以使用public
- 内部类作用域:由于其上一级是外部类,作用域分为为:同一个类,同一个包,父子类,任意位置
- 父类作用域:由于其上一级是包,所以作用域分为:同一个包,任意位置
- main方法不同于本类中其他方法,main创建内部类对象的方式与除本类之外的其他类创建该内部类的方式一致(其实是因为main方法是静态的,java中规则:静态不能访问非静态,若要访问只能创建非静态对象进行调用,补:非静态可以访问静态)
演示内部类
package newTest2;
public class Outer {
public static int a = 5;
int b = 6;
public void sa() {
Inner aa = new Inner();
aas gge = new aas();// main方法不能使用这种是因为main是静态方法,
//java中规定静态无法访问非静态,除非创建非静态的对象进行调用(静态中没有this)
}
protected static class Inner {
public static int i = 4;
static class Inner2 {
public static int gg = 6;
{
a = 7;
}
}
public class Inner3 {
public int haha = 7;
{
a = 6;
}
}
}
protected class aas {
Outer.Inner add = new Outer.Inner();// static在除外部类的其他类使用
}
public static void main(String[] args) {
aas gs = new Outer().new aas();//main方法是静态的,静态无法访问非静态,只能先创建其对象进行调用
Outer ii = new Outer();
Inner awa = new Inner();
System.out.println(new Inner().i);
// new Outer().new Inner().say();
}
}
演示继承父类是否会继承内部类的
package newTest2;
public class ExtendsOuter extends Outer {
protected static class Inner {//可以重写父类的静态内部类以及其内部的内部类
public static short i = 9;
static class Inner2 {
public static int gg = 6;
{
a = 7;
}
}
public class Inner3 {
public int haha = 7;
{
a = 6;
}
}
}
public void say() {
a = 6;
Inner a = new Inner();//继承了静态内部类
Inner.i = 6;//静态属性可见
Inner.Inner3 d = new Inner().new Inner3();//静态内部类的非静态内部类依然继承
Inner.Inner2 b = new Inner.Inner2();//静态内部类的静态内部类依然继承
b.gg = 5;//静态内部类的静态内部类内静态属性可见
aas c = new aas();//非静态内部类也继承
}
public static void main(String[] args) {
System.out.println(Inner.i);
new ExtendsOuter().say();
System.out.println(Inner.i);
System.out.println();
}
}