内部类
内部类(inner class)是定义在另一个类中的类。
为什么需要使用内部类呢?
- 内部类可以对同一个包中的其他类隐藏
- 内部类方法可以访问定义这个类的作用域中的数据,包括原本的私有数据
public class Test01 {
private int a = 10;
private String b = "hello";
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
class Inner {
public void innerPrint() {
System.out.println(a);
System.out.println(b);
setA(20);
System.out.println(getA());
setB("world");
System.out.println(getB());
}
}
从上述代码可以看到,一个内部类方法可以访问自身的数据字段,也可以访问创建它的外围类对象的数据字段
内部类的对象总有一个隐式引用,指向创建它的外部类对象
只有内部类可以是私有的,而常规类可以有包可见性或公共可见性
内部类中声明的所有静态字段都必须是final,并初始化为一个编译时常量。如果这个字段不是一个常量就可能不唯一。
静态内部类
有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类有外围类对象的引用。为此,可以将内部类声明为static,这样就不会生成那个引用。
class Inner2 {
public void innerPrint() {
System.out.println(a);
System.out.println(b);
setA(20);
System.out.println(getA());
setB("world");
System.out.println(getB());
}
}
static class Inner {
public void innerPrint() {
Test01 t = new Test01();
System.out.println(t.a);
System.out.println(t.b);
t.setA(20);
System.out.println(t.getA());
t.setB("world");
System.out.println(t.getB());
}
}
静态内部类中只能访问外部类中被static修饰的内容
外部类想要访问内部类的东西,需要创建内部类的对象然后进行调用
创建内部类的对象:
//静态的成员内部类创建对象:
TestOuter.E e = new TestOuter.E();
//非静态的成员内部类创建对象:
TestOuter t = new TestOuter();
TestOuter.D d = t.new D();
static关键字
- static可以修饰:属性,方法,代码块,内部类。
- static修饰属性
public class Test {
//属性:
int id;
static int sid;
public static void main(String[] args) {
//创建一个Test类的具体的对象
Test t1 = new Test();
t1.id = 10;
t1.sid = 10;
//读取属性的值:
System.out.println(t1.id);
System.out.println(t1.sid);
}
}
static修饰属性总结:
(1)在类加载的时候一起加载入方法区中的静态域中
(2)先于对象存在
(3)访问方式: 对象名.属性名 类名.属性名(推荐)
属性:
静态属性 (类变量)
非静态属性(实例变量)
- static修饰方法;
static和public都是修饰符,并列的没有先后顺序,先写谁后写谁都行
在静态方法中不能访问非静态的方法,在静态方法中不能访问非静态的属性
在静态方法中不能使用this关键字
非静态的方法可以用对象名.方法名去调用
在同一个类中可直接调用
final关键字
-
修饰变量
final修饰一个变量,变量的值不可以改变,这个变量也变成了一个字符常量
修饰引用数据类型,那么地址值就不可以改变,对象的属性依然可以改变
被final修饰 ,指向不可以改变
-
修饰方法
final修饰方法,那么这个方法不可以被该类的子类重写
-
修饰类
final修饰类,代表没有子类,该类不可以被继承