java4中种内部类
什么是内部类?
在类的内部定义另一个完整的类
成员内部类
类中定义另一个类
public class Outer { //定义一个外部类
private int age=20;
private String name="张三";
public void test(){
System.out.println("这是外部类"); //内部类有何作用?他可以访问外部类的私有属性
}
public class Inter{ //定义一个内部类
private int age=40;
private String name="王五";
public void testOuter(){
System.out.println(Outer.this.name);//如果重名会优先访问内部类
//通过外部类名称.this.属性名来访问外部类属性
System.out.println(name);
System.out.println(Outer.this.age);
System.out.println(age);
}
}
}
class test{
public static void main(String[] args) {
//实例化内部类的第一种方法
Outer outer = new Outer();//先定义外部类
Outer.Inter inter = outer.new Inter();//在定义内部类
inter.testOuter();
}
}
静态内部类
类中定义一个静态类
public class StaticOuter { //新建一个外部类
private int age=20;
private String name="sss";
public static class StaticInter{ //新建一个静态内部类,只能在内部创建静态内部类,外部不能创建静态类
private int age =40;
private String name="ddd";
private static String address="shanghai";
public void test(){
StaticOuter staticOuter = new StaticOuter();
System.out.println(staticOuter.age);//在静态内部类调用外部类属性,需要实例化外部类
System.out.println(staticOuter.name);
System.out.println(age); //直接调用静态内部类
System.out.println(name);
System.out.println(address); //直接调用内部类的静态成员
}
}
}
class test1{
public static void main(String[] args) {
StaticOuter.StaticInter inter=new StaticOuter.StaticInter();//通过外部类.内部类 对象名称=new外部类.内部类();
//新建内部类对象
inter.test();
}
}
局部内部类
在类中的方法中在定义一个类
public class PartOuter { //新建一个外部类
private int age=30;
private String name="dzw";
public void show(){ //定义一个方法,局部内部类就是定义在方法里面
final int age1=60; //定义一个局部属性,必须是常量,jdk1.8以后可省略final,系统默认有
class PartInter{ //定义一个局部内部类,不能用任何修饰符修饰
private int age=90;
private String name="www";
public void show1(){
System.out.println(PartOuter.this.age); //可直接调用外部类的属性
System.out.println(PartOuter.this.name);
System.out.println(name);
System.out.println(age1);
System.out.println(age);
}
}
PartInter partInter = new PartInter(); //通过在类外面,新建内部类实例化对象,来调用内部类的方法
partInter.show1();
}
}
class test2{
public static void main(String[] args) {
PartOuter partOuter = new PartOuter(); //创建外部类实例化
partOuter.show(); //调用show方法,不能调用方法里面类的方法
}
}
匿名内部类
没有类名的局部内部类
必须继承父类或者实现一个接口
public interface Usb {
//定义一个方法,鼠标
void mouse();
}
public class AnonymousOuter {
}
class test3{
public static void main(String[] args) {
Usb usb1 = new Usb(){ //通过接口来实现匿名内部类,省去了局部内部类的步骤,在main方法中,所以是局部匿名内部类
@Override
public void mouse() {
System.out.println("风扇启动");
}
};
usb1.mouse();
}
}