Java学习笔记——内部类和static修饰符

Java学习笔记——内部类和static修饰符

内部类

内部类(inner class)是定义在另一个类中的类。
内部类的特点:

  • 内部类是一种编译时的语法,编译后生成的两个类是独立的两个类。(对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.classouter$inner.class两个类)。
  • 可以*访问外部类的任何成员(包括私有成员),但外部类不能直接访问内部类的成员。
  • 内部类可为静态,可以用protected、private修饰,而外部类只能使用public和缺省的包访问权限。
  • 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
内部类的形式:
  • 成员内部类
    作为外部类的一个成员存在,与外部类的属性、方法并列。内部类和外部类的实例变量可以共存。
    Java学习笔记——内部类和static修饰符
    建立内部类对象时应注意:
    – 在外部类的内部可以直接使用inner s=new inner();(因为外部类知道inner是哪个类,所以可以生成对象)。
    – 在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用),然后再生成一个内部类对象。
	OuterClass outer = new OuterClass();		
    //创建内部类对象
    OuterClass.InnerClass  inner = outer.new  InnerClass ();
    //或
    // OuterClass.InnerClass  inner  = new OuterClass().new  InnerClass ();

在内部类中访问内部类变量:this.属性
内部类作为外部类的成员,可以访问外部类的私有成员或属性。访问方式:外部类名.this.属性
在外部类的外部访问内部类,内部类的对象.对象名

  • 局部内部类
    在方法中定义的内部类称为局部内部类,类似局部变量。
    – 局部内部类不能加修饰符public、protected和private,其范围为定义它的代码块。
    – 可以访问外包方法之外的外部类之内的所有成员。还可以访问所在外包方法中的参数。
    – 局部内部类不能声明为接口。
    要想使用局部内部类时,需要生成外部类对象,通过外部类对象调用外包方法,在方法中才能调用局部内部类。
  • 匿名内部类
    将局部内部类的使用再深入一步。假如只创建这个类的一个对象,就不必对内部类命名了。这种类被称为匿名内部类。
    – 匿名类没有类名,它必须继承一个类或是实现一个接口。不能有显示的extends和implements子句。
    – 匿名类不能有构造函数,因为它没有类名。可以通过new<父类名>的方法创建对象,匿名类的创建和定义同时进行。
    – 匿名类只能一次性的创建其对象。
    – 匿名类可以在方法体中,也可以在参数列表中。
    – 匿名内部类一定是在new的后面其隐含实现一个接口或一个类,没有类名。
    – 匿名内部类不能是抽象类。
    – 匿名内部类必须实现它的抽象父类或者接口里的所有抽象方法。
  • 静态内部类
    静态内部类定义在类中,在任何方法之外,用static定义。
    静态内部类的对象可以直接生成。
    例:Outer.Inner in = new Outer.Inner ();
    – 静态内部类能直接访问外部类的静态成员,不能直接访问外部类的实例成员(外部类的对象访问)。
    – 静态内部类里面可以定义静态成员,其他内部类不可以。

static修饰符

静态方法

语法定义
权限修饰符 static 返回值类型 方法名(形式参数列表){
…方法体
}
例如:public static void main(String[] args){ }

使用方法
类名. 方法名(实际参数列表);

使用规则

  • 静态方法中,仅能调用其他的static 方法。
  • 在静态方法中,只能访问static数据。
  • 在静态方法中,不能以任何方式引用 this 或 super。

静态变量值一旦改变,所有类的对象均共享改变

static代码块

Static代码块仅在该类被加载时执行一次。
涉及到继承的时候,会先初始化父类的static变量,然后是子类的。

  • 子类实例化对象时的执行顺序
    – 父类的静态代码块;
    – 子类的静态代码块;
    – 父类的构造方法;
    – 子类的构造方法。

通常一个普通类不允许声明为静态的,只有一个内部类才可以。
声明为静态的内部类可以直接作为一个普通类来使用,而不需实例化一个外部类。

  • static和final一起使用
    –static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。
    –对于变量,表示一旦赋值就不可修改,并且通过类名可以访问。
    –对于方法,表示不可覆盖,并且可以通过类名直接访问。
  • Java中的变量
    静态变量(被static修饰的变量,叫静态变量或类变量)
    实例变量(没有被static修饰的变量,叫实例变量)