1. 内部类
很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了
1.1 内部类概述
- 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
- 内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。 我可以把外边的类称为外部类,在其内部编写的类称为内部类。
- 内部类分为四种:
1.2 成员内部类(实例内部类、非静态内部类)
注:成员内部类中不能写静态属性和方法
1.2.1 【定义一个内部类】
public class Outer {
private int id;
class Inner {
public void in() {
System.out.println("这是内部类方法");
}
}
public void out() {
System.out.println("这是外部类方法");
}
}
1.2.2【实例化内部类】
实例化内部类,首先需要实例化外部类,通过外部类去调用内部类
class Test {
public static void main(String[] args) {
Outer outObject = new Outer();
Outer.Inner inObject = outObject.new Inner();
inObject.in();
}
}
分析: 想想如果你要使用一个类中方法或者属性,你就必须要先有该类的一个对象,同理,一个类在另一个类的内部,那么想要使用这个内部类,就必须先要有外部类的一个实例对象,然后在通过该对象去使用内部类。
1.2.3 【成员内部类能干什么?】
- 访问外部类的所有属性(这里的属性包括私有的成员变量,方法)
public class Outer {
private String id = "11923020124";
class Inner {
public void in() {
System.out.println("这是内部类方法");
}
public void getId() {
System.out.println("id: " + id);
}
public void useOut() {
out();
}
}
public void out() {
System.out.println("这是外部类方法");
}
}
class Test {
public static void main(String[] args) {
Outer outObject = new Outer();
Outer.Inner inObject = outObject.new Inner();
inObject.in();
inObject.getId();
inObject.useOut();
}
}
如果内部类中的变量名和外部类的成员变量名一样,要通过创建外部类对象 "."属性来访问外部类属性,通过this.属性访问内部类成员属性
public class Outer {
private String id = "Outer Id";
class Inner {
private String id = "Inner Id";
public void getInnerId() {
System.out.println(id);
}
public void getOuterId() {
System.out.println(Outer.this.id);
}
}
public void out() {
System.out.println("这是外部类方法");
}
}
class Test {
public static void main(String[] args) {
Outer outObject = new Outer();
Outer.Inner inObject = outObject.new Inner();
inObject.getInnerId();
inObject.getOuterId();
}
}
说明:
如何调用外部类的成员变量呢?通过Outer.this,因为如果想实例化内部类对象,就必须通过外部类对象,当外部类对象new出内部类对象时,会把自己(外部类对象)的引用传到了内部类中,所以内部类就可以通过Outer.this来访问外部类的属性和方法,到这里,你也就可以知道为什么内部类可以访问外部类 的属性和方法,这里由于有两个相同的属性名称,所以需要显示的用Outer.this来调用外部类的属性,平常如果属性名 不重复,那么我们在内部类中调用外部类的属性和方法时,前面就隐式的调用了Outer.this。
1.2.4 借助成员内部类,来总结内部类(包括4种内部类)的通用用法:
- 要想访问内部类中的内容,必须通过外部类对象来实例化内部类。
- 能够访问外部类所有的属性和方法,原理就是在通过外部类对象实例化内部类对象时,外部类对象把自己的引用传进了内部类,使内部类可以用通过Outer.this去调用外部类的属性和方法,一般都是隐式调用了,但是当内部类中有属性或者方法名和外部类中的属性或方法名相同的时候,就需要通过显式调用Outer.this了。
|