标签:protected 代码 依赖 public 实例 有一个 对象 封装 需要
用内部类的原因有以下几种:
内部类与外部类的区别:
非静态内部类不能拥有静态成员
public class OutClass {
private String val = "000";
private class InClass{
private String val = "123";
public void showval(){
System.out.println("外部类的val:"+OutClass.this.val); //因为非静态内部类寄生在外部类的实例中,所以会持有外部类实例的引用this
System.out.println("内部类的val:"+this.val); //或者直接val
}
}
public void showvalByInClass(){
InClass inClass = new InClass(); //外部类如果像访问内部类的成员,则必须要创建内部类对象
inClass.showval(); //换而言之,如果有一个内部类存在,则一定有一个它所寄生的外部类存在(无法脱离外部类而存在(在private修饰情况下))
}
}
class TestInClass{
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.showvalByInClass();
}
}
而且根据静态成员不能访问非静态成员的规则,外部类的静态方法、静态代码块不能访问非静态内部类。
如果使用static来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个实例。
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(静态成员)。
public class OutClass {
private static String val = "000";
private static class InClass{
private static String sval = "456";
private String val = "123";//即使用pirvate修饰,外部类还是可以通过创建内部类的实例来直接访问,然而不是外部类就不行了
public void showOutval(){
System.out.println("外部类的val:"+OutClass.val);//静态内部类不必再依赖于外部类的实例而生,所以不会再持有其所寄生的外部类实例的引用
}
}
public void InClassval(){
System.out.println(InClass.sval);
System.out.println(new InClass().val);
new InClass().showOutval();
}
}
class TestInClass{
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.InClassval();
}
}
Java允许在接口中定义内部类,接口里定义的内部类默认使用(也只能使用)public static修饰,也就是说,接口中只能定义静态内部类。
标签:protected 代码 依赖 public 实例 有一个 对象 封装 需要
原文地址:https://www.cnblogs.com/woshi123/p/12458478.html