JAVA内部类

内部类是一种类的结果扩充,一个类的内部除了属性和方法外,还可以存在其他类的结构,并且内部类也可以定义在方法或代码块中。

  1. 基本概念

    所谓的内部类指的就是在一个类的内部继续定义其他内部结构类

    观察内部类的基本形式:

    package oop;
    ​
    /**
     * 观察内部类的基本形式
     */
    class Outer{//外部类
        private String msg="Hello World!";//属性
        class Inner{//内部类
            public void print(){
                System.out.println(msg);
            }
        }
        public void fun(){
            new Inner().print();
        }
    ​
    }
    public class TestDeno{
        public static void main(String[] args) {
            Outer out=new Outer();//实例化对象
            out.fun();
        }
    }
    ​

    内部类的基本形式就是将类的定义拿到类的内部,也就是说除了属性和方法外,也可以定义属于自己内部的结构体。这样做最大的缺点在于破坏了类的结构性。它最大的帮助就是可以轻松地访问外部类中的私有属性。

    将内部类放在外部并且实现同样功能:

    package oop;
    ​
    /**
     * 将内部类放在外部同样实现此功能
     */
    class Outer1{
        private String msg="Hello World!";//属性
        public void fun(){
            //this表示当前调用fun()方法的对象,在本程序中主方法由Out对象调用,所以this就是out
            new Inner1(this).print();//实例化对象调用print()方法
        }
        //内部类需要访问msg属性,但是此属性属于Outer1类,而在Outer1类里面此属性使用Private进行封装
        //所以如果此时要得到这个属性的内容,需要定义一个getter方法
        public String getMsg(){
            return this.msg;
        }
    }
    class Inner1{
        private Outer1 out;//必须依靠对象才可以调用getMsg()方法
        public Inner1(Outer1 out){//在构造方法中接收外部类对象
            this.out=out;
        }
        public void print(){
            System.out.println(this.out.getMsg());
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            Outer1 out=new Outer1();
            out.fun();
        }
    }
    ​

    所以内部类的最大好处就是可以方便地访问外部类中的私有属性

    外部类访问内部类的私有属性:

    package oop;
    ​
    /**
     * 访问内部类的私有属性
     */
    class Outer2{
        private String msg="Hello World!";
        class Inner2{
            private String info="世界 你好!";
            public void print(){
                System.out.println(Outer2.this.msg);
            }
        }
        public void fun(){
            Inner2 in=new Inner2();
            System.out.println(in.info);
            in.print();
        }
    }
    public class TestDemo{
        public static void main(String[] args) {
            Outer2 out=new Outer2();
            out.fun();
    ​
        }
    }
    ​

    外部类可以直接利用内部类的对象使用"对象.属性"的形式访问私有属性操作。

    内部类对象的实例化语法操作

    外部类.内部类  对象=new 外部类().new 内部类();

    内部类对象的实例化语法格式只是一个基础,指的是在一个内部类只定义一个内部类的情况,而如果一个内部类中又定义了内部类,则类结构需要继续向下延伸:

    外部类.内部类1.内部类2 对象=new 外部类().new 内部类1().new 内部类2();

    实例化内部类对象:

    package oop;
    ​
    /**
     * 实例化内部类对象
     */
    class Outer3{
        private String msg="Hello World!";
        class Inner3{
            private String in="罗小齐草泥马!";
            public void print(){
                System.out.println(Outer3.this.msg);
                System.out.println(in);
            }
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            Outer3.Inner3 in=new Outer3().new Inner3();
            in.print();
        }
    }
    ​

    如果一个内部类只希望被一个外部类访问,不能被外部调用,那么可以使用private定义私有内部类

  2. 使用static定义内部类

    使用static定义的属性或方法是不受实例化对象控制的,所以如果使用static定义内部类,它一定不可能受到外部类的实例化对象控制

    如果一个内部类使用static定义,那么这个内部类就变为一个"外部类",并且只能访问外部类中定义的static操作。相当于定义一个外部类。

    使用如果想要取得内部类的实例化对象,其语法格式如下

    外部类.内部类 对象=new 外部类.内部类();

    实例化"外部类"对象:

    package oop;
    /**
     * 使用static定义内部类
     */
    class Outer4{
        private static String msg="Hello World!";
        static class Inner4{
            private String in="HelloWorld!";
            public void print(){
                System.out.println(Outer4.msg);
                System.out.println(in);
            }
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            Outer4.Inner4 in=new Outer4.Inner4();
            in.print();
        }
    }
    ​

    实例化内部类的操作有如下两种格式:

    • 格式一(非static定义的内部类):

      外部类.内部类  内部类对象=new 外部类().new 内部类();
    • 格式二(static定义内部类):

      外部类.内部类 内部类对象=new 外部类.内部类();
  3. 在方法中定义内部类

内部类理论上可以在类的任意位置上进行定义,包括在代码块中,或在普通方法中。

在普通方法中定义内部类:

package oop;
​
/**
 * 在方法中定义内部类
 */
class Outer5{
    private String msg="Hello World!";
    public void fun(){
        class Inner5{
            private String in="今天天气很适合在家敲代码!";
            public void print(){
                System.out.println(Outer5.this.msg);
                System.out.println(in);
            }
        }
        new Inner5().print();
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Outer5 out=new Outer5();
        out.fun();
    }
}
​

访问方法中定义的参数或变量:

package oop;
​
/**
 * 访问方法中内部类定义的参数或变量
 */
class Outer6{
    private String msg="Hello World!";
    public void fun(int num){
        double score=99.9;
        class Inner6{
            private String in="今天天气真好";
            public void print(){
                System.out.println(in);
                System.out.println("属性:"+Outer6.this.msg);
                System.out.println("方法参数:"+num);
                System.out.println("方法变量:"+score);
​
            }
        }
        new Inner6().print();
    }
}
public class TestDemo {
​
    public static void main(String[] args) {
        Outer6 out=new Outer6();
        out.fun(100);
    }
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值