1什么是内部类
一个类定义在另一个类的内部,这就是内部类。定义方法与一般类定义相同,广义上我们将内部类分为四种:成员内部类、静态内部类、局部(方法)内部类、匿名内部类。
public class Big{//外部类
class Little{//内部类
}
}
1.1内部类的作用
以下面的代码为例
public class Big{//外部类
private int a=10;
class Little{//内部类
private String name;
public void say() {
System.out.println(name);
}
}
}
class Middle{
public void say() {
// 在外界类初始化内部类对象
Little t1 = new Big().new Little();
t1.say();
}
}
1.内部类Little可以访问Big类的a属性
2.创建内部类对象的时刻并不依赖于外围类对象的创建(区别于继承中创建子类对象会先创建父类)
3.内部类提供了更好的封装,除了该外围类,其他类都不能访问
2 static 关键字
在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
2.1作用
修饰对象 | 作用 |
---|---|
内部类 | 静态内部类可以独立存在,不依赖于其他外围类 |
变量 | 静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化 |
方法 | 不依赖于任何对象就可以直接访问 |
块 | 静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块。在类初次被加载时,会按照静态初始化块的顺序来执行每个块,并且只会执行一次 |
5.还有一个就是导入静态包,访问所有静态属性
public class Util {
public static final double PI = 3.14;
public static String getSuffix(String path) {
return path.substring(path.lastIndexOf(".") + 1);
}
}
// jdk 1.5提供的新特性,静态导入
import static com.openlab.day12.innerclass.Util.*;//静态导入
public class Test {
public static void main(String[] args) {
// String suffix = Util.getSuffix("c://a.b/c/d.txt");未导入静态包的方法
// System.out.println(suffix);
String suffix = getSuffix("c://a.b/c/d.txt");
System.out.println(suffix);
System.out.println(PI);
}
}
2.2静态内部类
以下面的代码为例
public class TestInnerClass {
private int id = 10;
private static String name;
public void say() {
Inner01 t = new Inner01();
t.say();
}
public static class Inner02 extends Outer {
public void say() {
TestInnerClass tic = new TestInnerClass();
System.out.println(tic.id);
System.out.println(name);
}
}
}
class Outer {
public void say() {
// 静态内部类,在外界类可以使用下面方式创建
Inner02 t2 = new TestInnerClass.Inner02();
}
}
- 内部可以包含任意的信息。 静态内部类的方法只能访问外部类的static关联的信息。
- 利用 外部类.内部类 引用=new 外部类.内部类();
- 然后利用引用.成员信息(属性、方法)调用。
- 访问内部类的静态信息,直接外部类.内部类.静态信息就可以了。
- 静态内部类可以独立存在,不依赖于其他外围类。
3 final
- final 修饰变量,该变量就会称为常量,不能够在被修改(runtime)。
可以看到当我在对PI进行赋值时跳出错误
- final可以修饰类,一旦final修饰类,该类就是最终类,不允许被继承。
同样可以看到报错
- final还可以修饰方法,该方法为最终方法,该方法不允许重写(Override)