inner class java_Java基础之内部类(InnerClass)

一、内部类介绍

内部类:将一个类的定义放在另一个类的定义内部。

内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

内部类的作用

1.内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以。

2.内部类拥有外围类的所有元素的访问权限。

3.每个内部类都能独立继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。也就是实现多重继承。

4.可以避免修改接口而实现同一个类中两种同名方法的调用。

二、四大内部类详解

1、成员内部类

定义:定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类。

案例如下:

public class MembersOuter {

private int count;

private Inner inner;

public MembersOuter() {

this.inner = new Inner();

}

/**

* 计数

*/

public int count(){

count = inner.num;

return count;

}

public void culcater(){

count ++;

}

public class Inner{

public int num = 2;

public int innerCount(){

culcater();

return count++;

}

public int innerCount2(){

return ++count;

}

}

public static void main(String[] args) {

MembersOuter out = new MembersOuter();

MembersOuter.Inner inner1 = new MembersOuter().new Inner();//创建内部类实例

MembersOuter.Inner inner2 = out.new Inner(); //创建内部类实例

System.out.println(out.count());

System.out.println(out.inner.innerCount());

System.out.println(out.inner.innerCount2());

}

}

案例输出结果:

2

2

4

要点:

成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。

【非静态内部类也可以定义静态成员同时需要有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义。】

创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)。

可以理解为隐式地保存了一个引用,指向创建它的外部类对象。

在成员内部类中访问外部类的成员方法和属性时使用:外部类名.this.成员方法/属性。也可直接调用。

内部类在编译之后生成一个单独的class文件,里面包含该类的定义,所以内部类中定义的方法和变量可以跟父类的方法和变量相同。

例如上面定义的三个类的class文件分别是:MembersOuterClass .classs和MembersOuterClass $InnerClass.class三个文件。

外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。

与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”。

2、静态内部类

定义:使用static修饰的成员内部类叫静态内部类。

案例如下:

案例输出结果:

要点

1、静态内部类可以有静态成员和静态方法。

2、静态内部类不可以访问外部类非静态的属性和方法。

3、外部类访问静态内部类需要通过内部类的一个实例来访问。

4、实例创建不需要通过外部类引用。

3、局部内部类

定义:定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。

要点

1. 局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)

2. 局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。

3. 可以使用abstract修饰,声明为抽象类。

4、匿名内部类

定义:匿名内部类没有名字,而且只能使用一次,创建实例后,类定义会立即消失。

要点

1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

2、匿名内部类中是不能定义构造函数的。

3、匿名内部类中不能存在任何的静态成员变量和静态方法。

4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

24c642e3460e

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值