Back End

java常用类相关内容

PineappleCat · 3月25日 · 2021年 184次已读

1.内部类

概念

  • 在一个类的内部在定义一个完整的类

特点

  • 编译之后可生成独立的字节码文件
    • Outer.class && Outer$Inner.class
  • 内部类可直接访问外部类的私有成员,而不破坏封装
  • 可为外部类提供必要的内部功能组件
/**
 * 内部类四种形式:
 * 1 成员内部类
 * 2 静态内部类
 * 3 局部内部类
 * 4 匿名内部类
 */
public class Outer {
    private String name;
    //内部类:一个类中包含一个完整的类,里层的类称为内部类,外层类称为外部类
    class Inner{

    }
}

分类

成员内部类

  • 在类的内部定义、与实例变量、实例方法同一级别
  • 创建成员内部类对象要依赖外部类对象
    • Outer out = new Outer();
    • Inner in = out.new Inner();
    • 二合一 new Outer().new Inner();
  • 特点
    • 成员内部类可以使用任何访问修饰符
      • 因为成员内部类与实例属性、实例方法同级别
      • 外部类只能用public和默认的
    • 成员内部类可直接访问外部类的属性和方法
      • 因为成员内部类与实例方法同级别
    • 当外部类与内部类存在重名属性时,会优先访问内部类属性,使用“外部类名.this”访问外部类的属性
    • 成员内部类不能定义静态成员(属性和方法)
      • 在类加载的时候,static变量就会被初始化,那么我们Inner对象在没有Outer这个对象的时候便生成了。这样这个成员内部类就脱离了外部类的掌控,不需要外部类的对象就可以生成内部类的对象,这与成员内部类的定义就相驳了,因为我们知道成员内部类的对象必须是现有外部类的对象才能创建,并且是绑定在一起的,所以成员内部类不可以定义静态变量。
      • 成员内部类是和实例方法同级别
      • 在加载Outer外部类的时候,内部类的静态属性就会被初始化,这是不被允许的,因为内部类没有new对象
    • 成员内部类可以包含静态常量
      • static final 特殊不可改变
      • 在外部类加载的时候就已经赋值,将值替换成初始值,不可改变。加载一次,定义了也没有关系
public class Outer {
    //实例属性
    private String name="张三";
    private int age=20;
    //实例方法
    public void show(){
        System.out.println(name+"...."+age);
    }
    //成员内部类:在类的内部定义,与实例变量、实例方法同级别的类。
    //特点:
    /*
    1成员内部类可以使用任意访问修饰符。
    2成员内部类可以直接访问外部类的属性和方法。
    3成员内部类中属性和外部类的属性同名时,使用"外部类名.this"访问外部类的属性
    4成员内部类不能包含静态成员,但是可以包含静态常量。*/
    class Inner{
         private String phone="1316737137";
         private String address="北京";
         private String name="灿灿";

         public void show(){
             System.out.println(phone+"..."+address);
             System.out.println(this.name+"======="+Outer.this.age);
             System.out.println(Outer.this.name+"======="+Outer.this.age);
         }
    }
}
public class Test {
    public static void main(String[] args) {
        //1 创建外部类对象
        /*
        Outer outer=new Outer();
        outer.show();
        //2 创建内部类对象
        Outer.Inner inner=outer.new Inner();
        inner.show();
        */
        //合二为一
        Outer.Inner inner2 = new Outer().new Inner();
        inner2.show();
    }
}

付费资源您未登录,请先

Click here to view the copyright notice of this site(点击此处查看本站版权声明)
0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!