内部类有多种类型: 实例内部类, 静态内部类, 匿名内部类, 局部内部类等
认识内部类,举几个简单例子说明:
实例内部类:
形如这样的定义在OuterClass中的Inner类, 就是一个实例内部类, 它所处的位置与OuterClass中其它的成员变量相同
class OuterClass{
public int data1=10;
private int data2=100;
public static int data3=1000;
class Inner{
Inner(){
System.out.println("内部类中的一个无参构造方法!");
}
public int data4=10000;
private int data5=100000;
}
}
静态内部类:
形如这样用static修饰的Inner类被称为静态内部类
class OuterClass2{
public int data1=10;
private int data2=100;
public static int data3=1000;
static class Inner{
Inner(){
System.out.println("静态内部类中的一个无参构造方法!");
}
public int data4=10000;
private int data5=100000;
}
}
匿名内部类:
形如这样的test(){}; 则被称为匿名内部类, 单纯的new test () 则为一个匿名对象, 只做简单的介绍, 重点在于静态内部类和实例内部类
class test{
test(){
System.out.println("test的一个无参的构造方法");
}
}
public class InnerClass2 {
public static void main(String[] args) {
new test(){
};
}
}
实例内部类
三个问题:
1. 如何实例化一个实例内部类对象?
2. 实例内部类中如何定义一个静态变量?
3. 实例内部类中的成员变量和外部类中的成员变量重名怎么办?
第一个问题:
首先如何实例化一个内部类对象呢, 显然用通常的实例化一个对象的方法是不行的, 内部类存在于外部类之中, 肯定是要依赖于外部类的, 所以在实例化一个内部类对象时必须要有一个外部类引用来调用
形如这样使用传统方式是完全不行的, idea编译器会自动报错的
正确的方式是用---外部类类名.内部类类名 变量 = 外部类引用.new 内部类
形如下方代码:
public class InnerClass {
public static void main(String[] args) {
OuterClass outerClass=new OuterClass();
OuterClass.Inner inner = outerClass.new Inner();
}
}
第二个问题:
当在内部类中定义一个静态变量时也会报错, 因为内部类对象需要依赖与外部类的, 所以当你在一个内部类当中定义一个静态变量时, 静态变量使用只依赖于当前类中, 会发生冲突所以默认是不可以定义的
是会报错的
如果非要定义则需要配合final一起使用, 此时就变成了一个常量, 在编译的时候就已经是确定的值了, 就不再是一个变量了
这里有一个注意事项, 内部类中是不可以定义一个静态方法的
第三个问题:
当内部类的成员变量和外部类的成员变量重名时, 可以看到下图, 会优先使用自己的
那么如何拿到外部类中的重名成员变量呢, 这也很简单因为内部类是依赖于外部类的, 所以只需要创建一个外部类对象来调用即可
内部类在编译后生成的字节码文件是独立的, 名称为: 外部类$内部类.class
静态内部类
两个问题:
1. 如何实例化?
2. 在静态内部类中如何访问外部类中的非静态成员变量?
第一个问题:
静态内部类的结构位置在文章开头已经说过, 想其它的静态变量一样静态内部类是不需要依赖于外部类对象的, 直接使用外部类名即可实例化, 形如下图:
因为这样的特性, 其使用的频率也是最高的
第二个问题:
在规定的语法中在静态内部类中只可以访问外部类中的静态成员变量, 如下图访问data1时会报错
那么当非要在内部类中访问外部类的非静态成员变量时该怎么办呢, 这也很简单, 同上面拿到重名的变量相同, 只需要创建一个外部类实例来进行调用即可
以上!