JAVA-内部类

概念

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。

注意:

1. 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部

2. 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

分类

  1. 实例内部类

即未被static修饰的成员内部类。

class OuterClass{
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

    class InnerClass{
        public int data4 = 4;
        private int data5 = 5;
        //public static int data6 = 6;
        public InnerClass(){
            System.out.println("实例内部类的构造方法!");
        }
        public void innerFunc(){
            System.out.println("实例内部类的普通方法");
            System.out.println(this.data1);
            System.out.println("外部类的"+OuterClass.this.data1);
        }
    }
}
public class test {
    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        OuterClass.InnerClass innerClass = out.new InnerClass();
    }

}
如何实例化内部类?

如果按照先学的知识,实例化因该是“InnerClass innerClass = new InnerClass();”会报错。那要怎么做呢?首先内部类要被调用必须先实例化外部类。先要有外部类的对象再用外部类的对象来调用内部类,就可以实例化了。即为“外部类类名.内部类 变量 = 外部类引用.new 内部类”很多教材会把我上述的两行写成一行:OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();是一样的,不过我个人觉得两行表示更清楚。

实例内部类当中,不能定义静态的成员方法?

其实也可以定义。不过这个静态的成员因该是final修饰的。如上面第九行代码因改为public static final int data6 = 6;

实例内部类当中,不能定义静态的成员变量?

真的不行。不要问为什么,语法。

如何访问实力内部类和外部类的同名的成员变量?

“外部类类名.this.成员“来进行访问。你可以理解为:实例内部类当中,包含外部类的this。所以他不仅仅有内部类的this,还有外部类的this。所以直接用“this.外部类的成员变量”是行不通的。(如果是静态的直接用外部类类名来访问)(同名的情况下在实例内部类方法中访问同名的成员时,优先访问自己的 )

外部类中的任何成员都可以被在实例内部类方法中直接访问 。

  1. 静态内部类

即被static修饰的内部成员类称为静态内部类。

public class OutClass {
private int a;
static int b;
public void methodA(){
a = 10;
System.out.println(a);
}
public static void methodB(){
System.out.println(b);
}

static class InnerClass{
public void methodInner(){

b =200;

methodB();
}
}
public static void main(String[] args) {

OutClass.InnerClass innerClass = new OutClass.InnerClass();
innerClass.methodInner();
}
}
如何拿到静态内部类的对象?

OuterClass.InnerClass innerClass = new OuterClass.InnerClass();他不需要外部类对象的引用。能比实例内部类少一个外部类对象。

不能在静态内部类中,直接访问外部类非静态的数据成员

就是不能只能访问静态的。如果你非要访问就在内部类实例化个对象呗。

  1. 匿名内部类

后序讲接口时给大家详细介绍。

  1. 局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值