Java学习笔记——内部类和static修饰符
Java学习笔记——内部类和static修饰符
内部类
内部类(inner class)是定义在另一个类中的类。
内部类的特点:
- 内部类是一种编译时的语法,编译后生成的两个类是独立的两个类。(对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两个类)。
- 可以*访问外部类的任何成员(包括私有成员),但外部类不能直接访问内部类的成员。
- 内部类可为静态,可以用protected、private修饰,而外部类只能使用public和缺省的包访问权限。
- 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
内部类的形式:
- 成员内部类
作为外部类的一个成员存在,与外部类的属性、方法并列。内部类和外部类的实例变量可以共存。
建立内部类对象时应注意:
– 在外部类的内部可以直接使用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修饰的变量,叫实例变量)