内部类🐺
1.1内部类概述🐒
内部类:就是在一个类中定义一个类,举例:在一个类A的内部定义一个类B,类B就被称为内部类
内部类定义格式:
class OuterClass { // 外部类 // ... class NestedClass { // 嵌套类,或称为内部类 // ... } }
范例:
public class Outer { public class Inter { } }
要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
代码示例:
public class Outer { private int age = 30; public class Inner { public void show() { System.out.println(age); } } public void method() { Inner i = new Inner(); i.show(); } }
1.2成员内部类🐷
按照内部类中定义的位置不同,可以分为如下两种形式
在类的成员位置:成员内部类
在类的局部位置:局部内部类
成员内部类,外界创建对象使用:
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
范例: Outer.Innter oi = new Outer().new Innter();
代码示例:
public class Outer { private int num = 10; /*public class Inner{ public void show() { System.out.println(num); } }*/ private class Inner{ public void show() { System.out.println(num); } } public void method(){ Inner i=new Inner(); i.show(); } }
/* 测试类 */ public class InnerDemo { public static void main(String[] args) { //创建内部类对象,并调用方法 //格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象; //Outer.Innter oi = new Outer().new Innter(); //oi.show(); Outer o = new Outer();//创建外部类对象,调用method方法,间接访问成员内部类私有属性 o.method(); } }
不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。