Java内部类及其使用

目录

 

1.内部类的概念:

2.内部类的分类:

Ⅰ.成员内部类

①间接方式使用成员内部类:

②直接方式使用成员内部类:

Ⅱ.局部内部类(包含匿名内部类)

①内部类的定义和使用

②局部内部类的final问题

③.内部类的同名变量访问

Ⅲ.定义一个类的时候,权限修饰符规则:



 

1.内部类的概念:

如果一个事物的内部包含另一个事物,那么这就是一个类 内部包含另一个类。

例如:身体和心脏的关系。又如:汽车和发动机的关系。房子和房间的关系等。

 

2.内部类的分类:

 

Ⅰ.成员内部类

 

成员内部类的定义格式:

修饰符 class 外部类名称 {

修饰符 class 内部类名称 {

//...

}

//...

}

 

注意:内用外,随意访问,外用内,需要内部类对象。

 

//内部类使用外部类成员变量

public class Body {    //外部类

    public class Heart {    //内部类

        //内部类方法
        public void beat() {
            System.out.println("内部类 心脏跳动 ");
            System.out.println("我叫" + name);    //private修饰的外部成员变量可以在内部类里访问
        }
    }

    //外部类成员变量
    private String name;

    public Body(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //外部类方法
    public void methodBody() {
        System.out.println("外部类方法");
    }

}

 

文件夹里显示内部类的名称如下:

 

①间接方式使用成员内部类:

在外部类的方法当中使用内部类,然后mian中只调用外部类的方法。

//外部类方法
public void methodBody() {
    System.out.println("外部类方法");
    Heart heart = new Heart();
    heart.beat();

 //或者   new Heart().beat();
}
public class DemoMain {
    public static void main(String[] args) {
             Body body = new Body("小明");  //外部类对象
             //通过外部类对象,调用外部类方法,里面间接使用内部类Heart
             body.methodBody();        

    }
}

 

②直接方式使用成员内部类:

格式:

【外部内名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】

public class DemoMain {
    public static void main(String[] args) {
           Body.Heart heart = new Body("小明" ).new Heart();
           heart.beat();
    }
}

 

Ⅱ.局部内部类(包含匿名内部类)

①内部类的定义和使用

 

如果一个类是定义在一个方法内部的,那么这个类就是一个局部内部类。

“局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。

 

定义格式:

修饰符 class 外部类名称{

修饰符 返回值类型 外部类方法名称(参数列表){

class 局部内部类名称{

//...

           }

     }

}

public class Outer {
    public void methodOuter(){
        class Inner{
            public void methodInner(){
                int num = 10;
                System.out.println(num);
            }
        }
        Inner inner = new Inner();
        inner.methodInner();
    }
}
public class DemoTest {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.methodOuter();
    }
}

 

②局部内部类的final问题

局部内部类,如果希望访问所在的方法的局部变量,那么这个局部变量必须是【有效final的】

 

备注:从java 8以后开始,只要局部变量事实不变,那么final关键字可以省略。

原因:

1.new出来的对象在推内存当中。

2.局部变量事跟着方法走的,在栈内存当中。

3.方法运行结束后,立刻出栈,局部变量就会立刻消失。

4.但是呢我出来的对象会在堆当中持续存在,知道垃圾回收消失。

public class MyOuter {
    public void methodOuter(){
       final int num = 10;
        class MyInner{
            public void methodInner(){
                //只要num是一直不变的常量 就算局部变量num跟着方法运行结束后消失,在消失前可以copy过来用
                System.out.println(num);
            }
        }

    }
}

③.内部类的同名变量访问

如果出现重名现象,那么格式是:外部类名称.this.外部类变量名

public class Outer {
    int num = 10;

    public class Inner{
        int num = 20;
        public void method(){
            int num = 30;
            System.out.println(num);  //内部类的局部变量
            System.out.println(this.num);  // 内部类的成员变量 就近原则 
            System.out.println(Outer.this.num);  //外部类的成员变量 
        }
    }
}

Ⅲ.定义一个类的时候,权限修饰符规则:

 

其中权限修饰符:public > protected > (default) > private

定义一个类的时候,权限修饰符规则:

1.外部类:public / (default)

2.成员内部类:public / protected / (default) / private

3.局部内部类:什么都不写

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值