1. 什么是内部类(InnerClass)?
一个类中嵌套着另一个类,这样的类就叫内部类.
语法:
class outClass{
public class innerClass{
}
}
2. 内部类的作用
一. 为了更好的封装, 更好的隐藏细节;
二. 对面对对象的继承进行了完善,也就是说: Java里是没有多继承的,然而在现实生活中是可以有多继承的,Java为了完善这种继承功能, 可以使用内部类来间接实现多继承. 每个内部类都可以单独继承一个父类或者接口而不受外部类继承父类和接口的影响.
三. 内部类可以访问外部类的所有成员,包括私有的成员.
3. 内部类的分类
一. 成员内部类
特点: 1. 成员内部类持有外部类对象的引用(外部类.this).
2. 成员内部类对象是依赖于外部类对象的,也就是说创建内部类对象首先要创建外部类对象.
格式为: outClass.innerClass inner = new OutClass().new innerClass();
3. 成员内部类对象是可以访问外部类的所有成员的,包括私有成员.但外部类对象不能直接访问内部类成员,必须选创建内部类的对象,通过对象名.成员来访问.
4. 成员内部类可以访问外部类的静态成员,可以把成员内部类当做外部类的一个普通成员方法来看待.
5. 成员内部类的字节码文件的名字是"外部类名$内部类名.Class"
6. 成员内部类中不能出现静态的成员.
下面通过一段代码来看看:
public class InnerClass {
public static void main(String[] args) {
Test.Test1 test1 = new Test().new Test1();
Test.Test2 test2 = new Test().new Test2();
test1.show();
test2.show();
}
}
class Parent {
public void show()
{
System.out.println("Parent");
}
}
interface Info{
public void show();
}
class Test{
class Test1 extends Parent{
@Override
public void show() {
super.show();
}
}
class Test2 implements Info{
@Override
public void show() {
System.out.println("接口");
}
}
}
该程序定义了一个接口Info和一个父类Parent类, 在Test类中,又定义了两个类Test1和Test2类分别继承Parent和接口实现类.
在主类中,可以分别定义这两个内部类的对象,通过对象,可以直接调用各个类中的方法.
二. 静态内部类
1. 可以把静态内部类看做是静态成员方法,静态的只能访问静态;
2. 静态内部类它独立于外部类的对象,它优先于外部类对象的创建.
创建格式: outClass.innerClass = new outClass.innerClass;
实例代码如下:
public class InnerClassDemo1 {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();//产生静态内部类对象
}
}
class Outer {
private int number1 = 10;
private static int number2 = 20;
public void showInner1() {
System.out.println(number1);
}
public static void showInner2() {
System.out.println(number2);
}
/*静态内部类*/
public static class Inner {
private static int num = 1;
private int num2 = 20;
public void show(){
System.out.println(num);
showInner2();
}
}
}
三. 局部内部类 ----一般申明在块语句中的内部类
1. 局部内部类可以看做是方法中的局部变量,不能加任何访问修饰符;
2. 局部内部类对象在其他外部类中不能创建对象,只能在其申明的方法中创建对象;
3. 除了静态内部类,其他内部类都持有外部类对象的引用.
示例代码如下:
public class LocalInnerClassDemo {
public static void main(String [] args){
Outer outer = new Outer();
outer.show();
}
}
class Outer{
private int num = 1;
public void show(){
int num2 = 20;
//声明在方法中的内部类就是局部内部类
class Inner{
private int num = 2;
public void show(){
System.out.println(Outer.this.num);
}
}
Inner inner =new Inner();
inner.show();
}
}
四. 匿名内部类--- 没有类名的内部类
语法: new接口(){
实现接口的方法
}
new 抽象类(参数列表){
重写类中的方法
}
示例代码如下:
public class AnonymousInnerClass {
public static void main(String[] args) {
/* MyInfo minfo= new MyInfo();
minfo.show();*/
//new 的是接口的一个实现类对象,只是这个类没有名字而已
new Info() {
@Override
public void show() {
System.out.println("hello");
}
}.show();
//info.show();
//创建出来一个Parent子类的一个对象
new Parent(){
@Override
public void show() {
System.out.println("hello,parent");
}
};
}
}
interface Info {
void show();
}
class XXX implements Info {
@Override
public void show() {
System.out.println("hello");
}
}