【自学java笔记#第二十七天#】越学越兴奋的内部类

选用教材:《Java核心技术卷一》

第六章 接口、Lambda表达式与内部类

和Lambda表达式一样,我个人认为书里面列举的例子不是很好懂,所以建议参考这个视频来学习内部类:

https://www.bilibili.com/video/BV18J411W7cE?p=189

一、内部类的基本定义

通俗一点来说,就是在一个类的内部被定义的类。

二、内部类的几种常见形式

1、成员内部类:也就是在外部类方法之外被定义的类;

2、局部内部类:即在外部类方法中被定义的类;

3、静态内部类:被声明为静态的内部类;

4、匿名内部类:没有名字的内部类,它是一种特殊的局部内部类。

三、内部类的语法规则

1、成员内部类

当成员内部类声明为public类型时,通过以下规则来创建一个内部类对象:

Outer.Inner oi=new Outer().new Inner();

注:Outer为外部类名、Inner为内部类名,下文同理。

当成员内部类声明为private类型时,就不能通过上面的方法来创建对象了。

这时要在外部类的一个方法中创建内部类对象,并调用内部类中的方法;然后再在主类创建一个外部类对象,并调用外部类方法。

例:

第一步:在外部类的一个方法中创建内部类对象

public void show(){

Inner in=new Inner();

in.accept();

}

第二步:在主类创建一个外部类对象,并调用外部类方法

public static void main(String...aggs){

Outer ou=new Outer();

ou.show();

}

2、局部内部类

和上面的情况稍微有一点区别,这里的第一部是在内部类中创建内部类对象并调用方法;再在主类中创建外部类对象,并调用外部类方法。

如果没有进行第一步,就直接走到第二步。

那么程序不会报错,但是它只能识别到内部类的代码块,并不能执行内部类里面的方法。

3、静态内部类

一道例题:学校School是外部类,饮水机WaterFountain是静态内部类,饮水机里有水量这个成员变量。

要求:新建一个School对象,并访问饮水机的水量,方法可以自由定义。

代码如下:

package innerClass;

class School//外部类学校
{
    static class WaterFountain//内部类饮水机
    {
        int n = 11;//内部类局部变量
    
        public void f()
        {
            System.out.println("水量:"+n);//输出内部类局部变量
        }
        
    }
    
    public void show()
    {
        WaterFountain wf = new WaterFountain();//实例化一个内部类对象
        wf.f();//调用f方法
    }
}
package innerClass;

public class SchoolTest 
{
    public static void main(String[] args)
    {
         School school = new School();
            school.show();
            //顶级类中访问静态类中的成员方法,需要创建静态内部类对象进行访问
            School.WaterFountain sw = new School.WaterFountain();
            sw.f();
    }

}

4、匿名内部类

它的本质是一个实现了某个接口或者继承了某个类的对象。

所以当要使用一个类来实现接口的时候,可以考虑使用匿名内部类。

建议直接参考本文顶部推荐的视频中,有关于匿名内部类的示例,通俗易懂。

猜你喜欢

转载自www.cnblogs.com/yizhinailu/p/12616493.html
今日推荐