N种内部类详解

面向对象之内部类

1.内部类

  • 什么是内部类

    • 内部类就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
  • 内部类的种类:

    • 1.成员内部类
    • 2.静态内部类
    • 3.局部内部类
    • 4.匿名内部类
  • 一个java文件中只能有一个public class,但可以有多个与public class并列的class类



1.1 成员内部类代码演示:

package oopdemo01.demo12;

//成员内部类
public class Demo01 {

    private int age=99;

    public  void test(){

        System.out.println("这是外部类的方法");
    }
    //一个java类中可以有多个class类,但是只能有一个public class类
    //成员内部类  加static为静态内部类
    class inner{

        public void print(){
            System.out.println("这是一个成员内部类");
        }

        //内部类可以获得外部类的私有属性
        public void getAge(){
            System.out.println(age);
        }

        public void getTest(){
            test();
        }

    }

}



package oopdemo01.demo12;
// 成员内部类的调用
public class Application {
    public static void main(String[] args) {
       //new 外部类
        Demo01 demo01 = new Demo01();
        //通过这个外部类来实例化内部类
        Demo01.inner inner = demo01.new inner();
        inner.print();
        inner.getAge();
        inner.getTest();


    }
}


运行结果

吃饭

1.2 静态内部类代码演示:

package oopdemo01.demo12;
//静态内部类  静态内部类;不能直接访问非静态的外部类属性(static先于非静态类生成)
public class Demo02 {
    private int id=5;

    public void out(){
        System.out.println("这是一个外部类的方法");
    }
    //成员内部类  加static为静态内部类
    public static class inner{

        public static void innered(){
            System.out.println("这是一个镜态内部类");
        }
    }

    //静态内部类是随类一起加载的,而外部类的一些私有方法和属性是非静态的
    //只有new关键字创建对象时才能够加载这些属性和方法,因此在静态已经加载的类中去调用那些没有加载的东西会报错。

    public static void main(String[] args) {
        Demo02 demo02 = new Demo02();
        //inner inner = demo02.new inner();   //因为静态内部类先加载所有不能使用先new外部再内部的方法

        inner inner = new inner();
        inner.innered();

    }

}



运行结果

这是一个镜态内部类

1.3 局部内部类代码演示:

package oopdemo01.demo12;
//局部内部类
public class Demo03 {
    private String name="小明";

    public void out(){
        int age=8;
        System.out.println("这是外部类的方法");
        //局部内部类
        class inner{

            public void innered(){
                System.out.println("这是局部内部内的方法");
            }
        }
        //使用局部内部类
        inner inner = new inner();
        inner.innered();

    }

    public static void main(String[] args) {
        Demo03 demo03 = new Demo03();
        demo03.out();

    }

}


运行结果

这是外部类的方法
这是局部内部内的方法

1.4 匿名内部类代码演示:

package oopdemo01.demo12;

//匿名内部类
public class Demo04 {
    private String name="张三";

    public void out(){
        System.out.println("匿名内部类的方法");
    }

}

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

        new Demo04().out();//不用将new出的对象用变量名来承接,直接new 类().直接调用函数,而不用再用承接new出的引用类名去调用方法,new Apple像是调用静态方法的类名一样,直接类名.静态方法名。

        //匿名内部类 没有名字初始化类,不用将实例保存到变量中
        userService userService = new userService(){

            @Override
            public void add(String name) {

            }
        };
    }
}

//接口
interface userService{
    void add (String name);
}

运行结果

匿名内部类的方法


2.更多参考

狂神说Java

posted @ 2022-06-06 20:08  哼哼哈¥  阅读(86)  评论(0编辑  收藏  举报