18_Java中的内部类

Java的内部类

一、内部类概述

1、内部类:其实就是在一个类中定义一个类(类似于C语言中的结构体的嵌套)

2、定义格式:

public class 类名{
    修饰符 class 类名{
        
    }
}

//示例
public class Outer{
    public class Inner{
        
    }
}

3、内部类的访问特点:

内部类可以直接访问外部类的成员,包括私有(可以参考类内的访问权限)

外部类要访问内部类的成员,必须创建对象(类通过对象访问成员)

4、参考代码:

package com.itheima_01;

/*
外部类
 */
public class Outer {
    //私有成员变量用于查看内部类访问
    private int num = 10;

    public class Inner{
        public void show(){
            System.out.println(num);
        }
    }

    //成员方法 测试外部类访问内部类
    public void method(){
        //show();   不能直接访问

        //用外部类访问 内部类成员
        Inner i = new Inner();
        i.show();
    }
}

二、成员内部类

按照内部类在类中定义的位置不同,可以分为如下两种形式:

在类的成员位置:成员内部类

在类的局部位置:局部内部类

成员内部类,外界如何创建对象使用呢?

格式:外部类名.内部类名 对象名 = 外部对象.内部类对象;

示例:Outer.Inner oi = new Outer().new Inner();

参考代码:

package com.itheima_02;
/*
外部类
 */
public class Outer {
    private int num = 10;


    /*public class Inner{
        public void show(){
            System.out.println(num);
        }
    }*/

    private class Inner{
        public void show(){
            System.out.println(num);
        }
    }

    //外部类定义一个方法用于内部类的访问
    public void method(){
        Inner i = new Inner();
        i.show();
    }
}
package com.itheima_02;
/*
测试类
 */
public class InterDemo {
    public static void main(String[] args){
        //创建内部类对象,并调用方法
//        Inter i = new Inner();    //输入内部类,不能直接访问

        //内部类创建语法格式 权限为public时
        //但是一般而言 我们定义内部类就是想把其隐藏起来
        //Outer.Inner i = new Outer().new Inner();

        Outer o = new Outer();
        //间接调用内部类方法
        o.method();
    }
}

三、局部内部类

局部内部类是在方法中定义类,所以外界是无法直接使用,需要在方法内部创建对象并使用

该类可以直接访问外部类的成员,也可以访问方法内的局部变量

参考代码:

package com.itheima_03;
/*
外部类
 */
public class Outer {

    private int num = 10;

    public void method(){
        int num2 = 20;

        //局部内部类
        class Inner{
            public void show(){
                System.out.println(num);
                System.out.println(num2);   //可以访问局部变量
            }
        }

        //创建对象调用方法
        Inner i = new Inner();
        i.show();
    }
}
package com.itheima_03;
/*
测试类
 */
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        //最开始并没有打印,是因为尽管调用了method方法,但是内部并没有调用内部类方法
        o.method(); //添加好了调用方式后就ok了
    }
}

四、匿名内部类(前提是一个局部内部类)

1、内部类的概述:

总结:匿名内部类的写法格式就是在写一个匿名的子类(实现类)对象,这个对象返回值可以被父类或者实现的对象接收参照多态,而又因为是对象所以可以直接在后面调用方法,注意末尾的 ; 号表示这是一条语句

1、前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类

2、格式:

new 类名(这个类名是父类或者子类)或者接口名(){
    重写方法;
};

//示例
new Inter(){	//本质是一个匿名的对象
    //重写方法说明这个类,继承了一个类或者实现了一个接口
    public void show(){
        
    }
};

3、本质:是继承了该类或者实现了该接口的子类(实现类)匿名对象

4、参考代码:

package com.itheima_04;
/*
定义一个接口
 */
public interface Inter {

    void show();
}
package com.itheima_04;
/*
定义一个外部类,用这个类中的匿名类内部类来重新接口中的方法
 */
public class Outer {

    public void method(){
        //匿名内部类本质是一个子类对象

       /*
       new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        };
        */

//        show();

        //这样写是 这个匿名内部类调用了show()方法
        //!!这也是匿名内部类尾部有 ; 的原因把
        /*new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        }.show();

        //第二次调用
        new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        }.show();*/

        //多次调用
        Inter i = new Inter(){
            @Override
            public void show(){
                System.out.println("匿名内部类");
            }
        };

        i.show();
        i.show();
    }
}
package com.itheima_04;
/*
测试类
 */
public class OuterDemo {
    public static void main(String[] args){
        Outer o = new Outer();
        o.method();
    }
}
2、匿名内部类在开发中的使用:
package com.itheima_05;
/*
跳高接口
 */
public interface Jumpping {
    public abstract void jump();
}
package com.itheima_05;
/*
定义一个接口操作类
 */
public class JumppingOperator {
    //接口作形参 需要的是这个接口的实现类对象
    public void method(Jumpping j){
        j.jump();
    }
}
package com.itheima_05;
/*
    测试类
 */
public class JumppingDemo {
    public static void main(String[] args) {
        //需求创建接口操作类对象,调用method方法
        JumppingOperator jo = new JumppingOperator();


        //改进后
        jo.method(new Jumpping(){
            @Override
            public void jump(){
                System.out.println("猫可以跳高了");
            }
        });

        jo.method(new Jumpping(){
            @Override
            public void jump(){
                System.out.println("狗可以跳高了");
            }
        });

        jo.method(new Jumpping(){
            @Override
            public void jump(){
                System.out.println("猪可以跳高了");
            }
        });

    }
}
posted @ 2022-10-09 16:24  如此而已~~~  阅读(28)  评论(0)    收藏  举报
//雪花飘落效果