内部类讲解

内部类:

1: Java中允许将一个类A声明在另一个类B中,则类A就称为内部类。
2: 内部类分类:成员内部类(静态,非静态)vs 局部内部类(方法内,代码块内,构造器内)
3:成员内部类

一方面,作为外部类的成员

  • 可以调用外部类的结构
  • 可以被static修饰
  • 可以被四种不同权限修饰

另一方面,作为一个类

  • 可以定义属性,方法,构造器等
  • 可以被final修饰,表示此类不能被继承
  • 可以被abstract修饰

4:局部内部类

不能使用任何的访问修饰符。
会生成两个.class文件,一个是Outer.class ,另一个是Outer$LocalInner.class。
局部内部类只能访问方法中声明的final类型的变量。

成员内部类代码

package java_04;

public class Test {
    public static void main(String[] args) {
        //调用静态的成员内部类
        Persion.Dog dog = new Persion.Dog();
        dog.show();

        //调用非静态的成员内部类
        Persion persion = new Persion();
        Persion.Cat cat = persion.new Cat();
        cat.show();
        cat.display("喵喵");

    }
}


class Persion{
    private String name = "人族";
    private int age = 18;

    public void eat(){
        System.out.println("人吃饭");
    }

    /*
    * 静态成员内部类*/
    static class Dog{
        String name;
        int age;
        public void show(){
            System.out.println("dog-----");
        }
    }

    /*
    * 非静态成员内部类*/
    class Cat{
        String name = "猫族";
        int age = 18;

        public Cat() {
        }

        public void show(){
            Persion.this.eat();
            System.out.println("cat-----");
        }

        public void display(String name){
            System.out.println("cat = "+name); //输出  cat = 喵喵
            System.out.println(this.name);//猫族
            System.out.println(Persion.this.name);//人族
        }
    }

}

局部内部类代码

package java_04;

public class Test02 {

    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        innerClass.drink();

    }
}

class InnerClass{

    String ssm = "良人怎奈变凉人,旧城之下念旧人";

    /**
     * 代码块中,属于局部内部类
     * 随着对象的加载而加载
     */
    {
        class Pig{
            String name;
            int age;
            public void show(){
                System.out.println("Pig-----");
            }
        }
        Pig pig = new Pig();
        pig.show();
    }

    /**
     * 外部类方法中,属于局部内部类
     * 开发中少见
     */
    public void drink(){
        class Animal{
            String name = "内部类";
            int age = 18;
            public void show(){
                System.out.println("animal-----");
                System.out.println(name+"   "+age);
                System.out.println(InnerClass.this.ssm);
            }
        }
        Animal animal = new Animal();
        animal.show();


        /**
         * 注意 匿名对象没有引用变量,只能使用一次,
         * 每次创建一个匿名对象都在堆中分配内存,都具有不同的内存地址。
         * 创建多了比较浪费资源。
         */
        //new Animal().show();
    }


    /**
     * 返回一个实现了Comparable接口的类的对象
     * 开发中常用方式
     * @return
     */
    public Comparable comparable(){
        class MyComparable implements Comparable{
            @Override
            public int compareTo(Object o) {
                System.out.println("MyComparable");
                return 0;
            }
        }
        return new MyComparable();
    }

}

内部类的继承

package java_04;

public class Test03 extends Persion{
    public static void main(String[] args) {
        Persion.Dog dog =new Test03.Dog();
        dog.show();


        Persion persion = new Test03();
        persion.eat();
    }


    @Override
    public void eat() {
        System.out.println("6666666");
    }
}

发布了11 篇原创文章 · 获赞 0 · 访问量 230

猜你喜欢

转载自blog.csdn.net/it147/article/details/104525875