JAVA中的内部类

一、实例内部类

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

public class Text {
    public static void main(String[] args) {

    }
}
class Out{
    int a = 1;
    int b = 2;
    public void fun(){
        System.out.println("out:fun()");

    }
    public static void fun1(){
        System.out.println("static:fun1()");
    }
    class innter{

        public void infun(){
            a = 1;//内部类的方法中访问外部类的成员变量
            fun();//内部类的方法中访问外部类的方法
        }
    }


}

2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
这与外部类的成员变量一样,受访问限定符的约束。

3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
 

如何访问内部类的方法?

public class Text {
    public static void main(String[] args) {
        Out out = new Out();
        Out.Innter in = out.new Innter();
        in.infun();


    }
}

先创建外部类的对象,Out.Innter为对象名的类型,通过外部类的对象名点的方式来访问内部类在堆空间中的数据。

public class Text {
    public static void main(String[] args) {
        Out out = new Out();
        Out.Innter in = out.new Innter();
        in.infun();


    }
}
class Out{
    int a = 1;
    int b = 2;
    public void fun(){
        System.out.println("out:fun()");

    }
    public static void fun1(){
        System.out.println("static:fun1()");
    }
    class Innter{

        public void infun(){
            a = 3;
            b = 4;
            System.out.println(a);
            System.out.println(b);

        }
    }


}

运行结果如下:

 访问相同名字的外部类的成员:

public class Text {
    public static void main(String[] args) {
        Out out = new Out();
        Out.Innter in = out.new Innter();
        in.infun();


    }
}
class Out{
    public int a = 1;
    public int b = 2;
    public void fun(){
        System.out.println("out:fun()");

    }
    public static void fun1(){
        System.out.println("static:fun1()");
    }
    class Innter{
        int a = 23;
        int b = 33;

        public void infun(){
            System.out.println(a);
            System.out.println(Out.this.a);//外部类名.this.相同变量名.外部类名通过点来访问自己的对象然后又通过点来访问成员变量。
            System.out.println(b);

        }
    }


}

4.实例内部类中不能访问static修饰的成员变量,非要定义必须要有static final修饰。

class Out{
    public int a = 1;
    public int b = 2;
    public void fun(){
        System.out.println("out:fun()");

    }
    public static void fun1(){
        System.out.println("static:fun1()");
    }
    class Innter{
        int a = 23;
        int b = 33;
        public static final int c = 2;
        c=3;//static final修饰的是常量,常量不能给常量赋值

        public void infun(){
            System.out.println(a);
            System.out.println(Out.this.a);
            System.out.println(b);

        }
    }


}

二、静态内部类

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

需要注意的点:

1. 在静态内部类中只能访问外部类中的静态成员
如何访问静态类中的成员?

OutClass2.InnterClass2 innterclass = new OutClass2.InnterClass2();
//外部类的类名.内部类的类名 对象名 = new 外部类类名.内部类的类名();
public class Text {
    public static void main(String[] args) {
        OutClass2.InnterClass2 innterclass = new OutClass2.InnterClass2();
        innterclass.fun();

    }
}
class OutClass2 {
    public int a = 1;
    public int b = 2;
    static class InnterClass2{
        public int c = 3;
        public int d = 4;
        public void fun(){
            System.out.println(a);//不能访问外部类的非静态成员。
            //非要访问,需要创建外部类的对象。
            OutClass2 out = new OutClass2();
            System.out.println(out.b);

        }
    }
}

三、局部内部类

1. 局部内部类只能在所定义的方法体内部使用

class OutClass2 {
    public int a = 1;
    public int b = 2;
    public void func(){
        class innter{
            public void fun1(){
                System.out.println("abcdef");
            }
        }
        Innter in = new Innter();
        in.fun1();
    }


2. 不能被public、static等修饰符修饰


3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$内部类名字.clas

 

 4.局部内部类

在接口内容中细讲。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值