Java内部类

你之因此能优于别人,正是由于你坚持了别人所不能坚持的。
本文相关代码在个人Github,欢迎Star~
https://github.com/zhangzhibo1014/DaBoJava

内部类

将一个类的定义放在另外一个类的定义内部,这就是内部类。而包含内部类的类被称为外部类git

内部类分类

  • 成员内部类
  • 局部内部类
  • 匿名内部类
  • 静态内部类

成员内部类

成员内部类是最普通的一种内部类,成员内部类能够访问外部类全部的属性和方法。可是外部类要访问成员内部类的属性和方法,必需要先实例化成员内部类。github

public class Demo {

    private String name = "Tom";

    // 定义一个成员内部类,做为成员变量
    class Student{
        private int age = 20;
        private String name = "Jack";

        public void show() {
            System.out.println("内部类属性;" + name);
            System.out.println("内部类属性:" + age);
            System.out.println("外部类属性:" + Demo.this.name);
        }
    }

    public static void main(String[] args) {
        //声明一个外部类对象
        Demo demo = new Demo();
        //声明一个内部类对象
        Student student = demo.new Student();
        student.show();
    }
}

成员内部类的使用方法

  • 内部类至关于外部类的一个成员变量,因此内部类可使用任意修饰符
  • 内部类在外部类里面,因此内部类里能够直接访问外部类的方法和属性,反之不行
  • 定义成员内部类后,必须使用外部类对象来建立内部类对象,即 内部类 对象名 = 外部类对象.new 内部类();
  • 若是外部类和内部类具备相同的成员变量或方法,内部类默认访问本身的成员变量或方法,若是要访问外部类的成员变量,可使用 this 关键字。

注:成员内部类不能含有 static 的变量和方法,由于成员内部类须要先建立了外部类,才能建立它本身的微信

静态内部类

静态内部类一般被称为嵌套类。app

静态内部类是不须要依赖于外部类的,这点和类的静态成员属性有点相似,而且它不能使用外部类的非static成员变量或者方法,这点很好理解,由于在没有外部类的对象的状况下,能够建立静态内部类的对象,若是容许访问外部类的非static成员就会产生矛盾,由于外部类的非static成员必须依附于具体的对象函数

public class Demo1 {
    private String name = "static";

    private static int id = 2019;

    static class Student{
        int id = 11;

        public void show() {
            System.out.println("外部类成员变量:" + (new Demo1().name));
            System.out.println("外部类静态成员:" + Demo1.id);
            System.out.println("内部类成员变量:" + id);
        }

    }

    public static void main(String[] args) {
        Student student = new Student();
        student.show();
    }
}

静态内部类特色

  • 静态内部类不能直接访问外部类的非静态成员,但能够经过 new 外部类().成员 的方式访问
  • 若是外部类的静态成员与内部类的成员名称相同,可经过 类名.静态成员 访问外部类的静态成员;若是外部类的静态成员与内部类的成员名称不相同,则可经过 成员名 直接调用外部类的静态成员
  • 建立静态内部类的对象时,不须要外部类的对象,能够直接建立 内部类 对象名 = new 内部类();

局部内部类

局部内部类,是指内部类定义在方法和做用域内ui

局部内部类也像别的类同样进行编译,但只是做用域不一样而已,只在该方法或条件的做用域内才能使用,退出这些做用域后没法引用的。this

/**
 * 局部内部类
 */
public class Demo2 {

    //将内部类定义在方法中
    public void show() {
        final String name = "Tom";
        class Student{
            int id = 20;
            public void show() {
                System.out.println("外部类方法变量:" + name);
                System.out.println("内部类属性变量:" + id);
            }
        }
        Student student = new Student();
        student.show();
    }

    //将内部类定义在做用域内
    public void display(int num) {
        if(num > 2) {
            class Person{
                int age = 18;

                public void show() {
                    System.out.println("age = " + age);
                }
            }
            Person person = new Person();
            person.show();
        } else {
            System.out.println("None");
        }
    }

    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        demo2.show();
        demo2.display(3);
    }
}

局部内部类特色

  • 局部内部类就像是方法里面的一个局部变量同样,是不能有 publicprotectedprivate 以及 static 修饰符的。
  • 局部内部类能够被 final 修饰。

匿名内部类

匿名内部类,顾名思义,就是没有名字的内部类。正由于没有名字,因此匿名内部类只能使用一次,它一般用来简化代码编写。但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口设计

/**
 * 匿名内部类
 */
public class Demo3 {

    public static void main(String[] args) {
        Demo3 demo3 = new Demo3();
        // 匿名内部类 -> 类继承
        new Animal() {
          public void say() {
              System.out.println("Say");
          }
        }.say();
        // 匿名内部类 -> 接口实现
        new Fruit(){
            public void eat() {
                System.out.println("apple");
            }
        }.eat();
    }

}

class Animal{
    public void say() {
        System.out.println("Animal say");
    }
}

interface Fruit{
    void eat();
}

匿名内部类特色

  • 匿名内部类是 不能加访问修饰符 的。要注意的是, new 匿名类,这个类是要先定义的, 若是不先定义,编译时会报错该类找不到。
  • 匿名内部类没有构造函数。

内部类的主要做用

  • 内部类提供了更好的封装,能够把内部类隐藏在外部类以内,不容许同一个包中的其余类访问该类
  • 内部类的方法能够直接访问外部类的全部数据,包括私有的数据
  • 内部类所实现的功能使用外部类一样能够实现,只是有时使用内部类更方便
  • 内部类容许继承多个非接口类型

总结

咱们能够根据具体需求来设计和使用内部类。code

相关代码记录于GitHub中,欢迎各位伙伴 Star对象

有任何疑问 微信搜一搜 [程序猿大博] 与我联系~

若是以为对您有所帮助,请 点赞收藏 ,若有不足,请评论或私信指正!谢谢~

相关文章
相关标签/搜索