内部类和匿名类
目录
一、内部类
1.数据访问
2.静态内部类
二、内部类和外部类区别
1.访问修饰符:
2.static修饰:
3.使用:
三、匿名类
PS:小练习
一、内部类
内部类是指将一个类定义在另一个里面。
内部类分为static内部类和普通内部类。
public class A{class B{//内部类}
}
这个内编译后会产生两个.class文件,分别是A.class、A$B.class。
一个类可以有多个内部类,内部类可以实现接口和继承类,内部类可以解决Java单继承问题,因为内部类和外部类可以相互访问。
1.数据访问
外部类和内部类可以相互访问类中的成员,包括私有的
package structure;public class A {public String name;private int age;public class B{//内部类public String bName;private int bAge;private void setAge(){name="";this.bAge=age;}}public class C{public String cName;private int cAge;}public void compareAge(){B b=new B();this.age=b.bAge;b.setAge();C c=new C();c.cAge=10;}public static void main(String[] args) {}
}
内部类的实例化,内部类依托于外部类,所以内部类的实例化要先实例化外部类,然后再实例化内部类。
package structure;public class ATest {public static void main(String[] args) {A a=new A();A.B b=a.new B();b.bName="";}
}
2.静态内部类
package structure;public class AA {static class BB{//static内部类}
}
静态内部类不能直接访问外部类的成员,可以直接访问外部类的静态成员。
package structure;public class AATest {public static void main(String[] args) {AA aa=new AA();AA.BB bb=new AA.BB();}
}
所有的访问修饰符都可以修饰内部类
二、内部类和外部类区别
1.访问修饰符:
外部类只有两种访问权限:public以及package-access
内部类可以有四种访问权限:public、protected、package-access、private
2.static修饰:
外部类不可以使用static修饰。
3.使用:
外部类可以直接被使用,内部类的使用依赖于外部类。
三、匿名类
匿名类是没有明确名称的类。
public static void main(String[] args) {
Pet pet = new Dog();
pet.cry();
//匿名类
Pet p = new Pet() {
@Override
public void cry() {
System.out.println("喵 喵 喵");
}
};
p.cry();
}
匿名类不能使用修饰符,在方法的内部,对外隐藏。
不能是static,隐式final类。
匿名类没有类名,没有构造方法。
匿名类可以访问类中的成员,不能访问方法中的变量,除非是final型的。
匿名类一般是实现接口、继承抽象类,相当于实现和继承了这个接口/类。
package structure;public abstract class Pet {public abstract void cry();//匿名类Pet pet = new Pet() {@Overridepublic void cry() {System.out.println("喵喵喵");}};}
PS:小练习
package structure;public class Outer {private int index=100;void print(){Inner i=new Inner();i.print();}class Inner{void print(){System.out.println(index);}}
}
class Test{public static void main(String[] args) {Outer outer=new Outer();outer.print();}
}