Java语法之内部类
Java语法之内部类
1、概述
内部类就是在一个类中定义一个类,比如在一个类A的内部定义一个类B,那么类B就被成为内部类。
(1)内部类的定义格式
public class 类名{ //外部类
修饰符 class 类名{ //内部类
}
}
示例:
public class Outer{
public class Inner{
}
}
(2)内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有。
- 外部类要访问内部类的成员/方法,必须创建对象。
public class Outer {
private int num=10;
public class Inner{
public void show(){
System.out.println(num); //可以直接访问外部类的成员
}
}
public void method(){
//不能直接调用内部类的show()方法,需要创建对象
Inner i=new Inner();
i.show();
}
}
2、内部类的分类
按照内部类在类中定义的位置不同,可以分为如下两种形式:
- 在类的成员位置:成员内部类
- 在类的局部位置(方法中):局部内部类
3、成员内部类
对于成员内部类,外界是无法直接创建内部类的对象的,需要通过外部类去访问,其格式为:外部类名.内部类名 对象名=外部类对象.内部类对象;
例如:Outer.Inner oi = new Outer().new Inner();
public class Outer { //定义一个外部类
private int num=10;
public class Inner{ //定义一个内部类
public void show(){
System.out.println(num);
}
}
}
public class InnerDemo {
public static void main(String[] args) {
//创建内部类对象,并调用方法
Inner i=new Inner(); //错误写法,无法直接调用内部类的成员
Outer.Inner oi=new Outer().new Inner(); //正确写法,先创建外部类对象,再由外部类创建内部类对象
oi.show();
}
}
上述代码中,内部类在定义的时候修饰符是public
,然而内部类一般不会这样用,内部类是不希望对外界,所以一般会设成private
,而如果设置成private
,上述语法格式就失效了,因此正确的访问方法应该是:在外部类中创建一个访问内部类的方法,外界想访问内部类时,由于外部类是公开的,所以可以创建外部类对象,然后调用外部类的访问内部类的方法,即可实现成功访问。
public class Outer { //定义一个外部类
private int num=10;
private class Inner{ //定义一个私有内部类
public void show(){
System.out.println(num);
}
}
public void method(){ //定义一个方法,创建内部类对象,访问内部类的method方法
Inner i =new Inner();
i.show();
}
}
public class InnerDemo {
public static void main(String[] args) {
Outer o=new Outer(); //创建外部类
o.method(); //调用外部类的method方法,实际上就是变相地访问内部类
}
}
4、局部内部类
局部内部类也是通过创建外部类对象去调用局部成员方法,而局部方法的内部需要去创建内部类的对象以及需要调用的内部类方法,示例如下。
public class Outer { //定义一个外部类
private int num=10;
public void method(){ //定义一个method局部方法
class Inner{ //方法中定义局部内部类
public void show(){
System.out.println(num);
}
}
Inner i=new Inner(); //需要在method局部方法里创建内部类对象
i.show(); //调用内部类的show()方法
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer o=new Outer(); //创建外部类对象
o.method(); //调用method局部方法
}
}
5、匿名内部类
匿名内部类是局部内部类的一种特殊形式。
前提:存在一个类或者接口(这里的类可以是具体类也可以是抽象类)
格式:
new 类名或者接口名(){
重写方法;
};
示例:
new Inter(){
public void show(){
}
};
理解:
重写方法说明继承了类或者接口,new关键字说明new后面的整体都是一个对象,只不过这个对象没有名字,因此是匿名的对象。
匿名内部类本质上就是一个子类匿名对象,这个对象继承了父类,或者实现了接口。
public class Outer { //定义一个外部类
public void method(){
new Inter(){ //定义匿名内部类(本质是对象)
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show(); //因为匿名内部类本质是对象,所以可以用.show()来调用对应的方法
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer o=new Outer();
o.method();
}
}