美文网首页
Java 内部类(嵌套类)和局部类

Java 内部类(嵌套类)和局部类

作者: 有梦想的狼 | 来源:发表于2020-08-26 16:41 被阅读0次

嵌套类

  • 定义在另一个类中的类,就叫嵌套类。
    在嵌套类外层的类,称为:外部类
    最外层的外部类,称为:顶级类

嵌套类又分为:内部类和静态嵌套类。

内部类

  • 没有被static修饰的嵌套类,非静态嵌套类。
    //外部类又是顶级类
    public class Person {
        private int age;
        //内部类
        public class Hand {
            private int weight;
        }
    }
    
  • 跟实例变量、实例方法一样,内部类与外部类的实例相关联。
    1. 必须先创建外部类实例,然后再用外部类实例创建内部类实例。
      //必须先创建person实例,才能创建hand对象。
      Person person = new Person()
      Hand hand = person.new Hand();
      
    2. 内部类不能定义除编译时常量(static final)以外的任何static成员。
  • 内部类可以直接访问外部类中的所有成员(即使被申明为private)
  • 外部类可以直接访问内部类实例的成员变量、方法(即使被申明为private)
public class Company {

    private String name;
    
    public Company (String name) {
        this.name = name;
    }
    
    public void fire(Employee e) {
        System.out.println(this.name + "fire" + e.no);
    }
    
    public class Employee {
        
        private int no;
        
        public Employee(int no) {
            this.no = no;
        }
        
        public void show() {
            System.out.println(Company.this.name + ":" + this.no);
        }
    }   
}
Company company = new Company("阿里巴巴");
Employee employee = company.new Employee(100);
company.fire(employee);
employee.show();

打印结果:

阿里巴巴fire100
阿里巴巴:100

静态嵌套类

  • 被static修饰的嵌套类
  • 静态嵌套类在行为上就是一个顶级类,只是定义的代码写在了另一个类中。
  • 可以直接访问外部类中的静态成员和方法(即使被声明为private)
public class Person {
    
    private int age;
    
    private static String name;
    
    private static void run() {
        System.out.println("Person - run");
    }
    
    public static class Car{
        public void print() {
            System.out.println(name);
            run();
        }
    }
}

什么情况下使用嵌套类?

  1. 如果类A只用在类C内部,可以考虑将类A嵌套到类C中
    • 封装性更好
    • 程序包更加简化
    • 增强可读性、维护性
  2. 如果类A需要经常访问类C的非公共成员,可以考虑将类A嵌套到类C中
    另外也可以根据需要将类A影藏起来,不对外暴露
  3. 如果需要经常访问非公共的实例成员,则设计成内部类(非静态嵌套类),否则设计成静态嵌套类
    如果必须先有C实例,才能创建A实例,那么可以将A设计为C的内部类

局部类

  • 可以定义在代码块中的类(可以定义在方法中、for循环中、if语句中等)
  • 局部类不能定义除编译时常量以外的任何static成员
  • 局部类只能访问final或者有效final的局部变量
    从Java 8开始,如果局部变量没有被第二次赋值,就认定为是有效final
  • 局部类可以直接访问外部类中的所有成员(即使被声明为private)
    局部类只有定义在实例相关的代码块中,才能直接访问外部类中的实例成员(实例变量、实例方法)
public class TestLocalClass {

    private int a = 1;
    private static int b = 2;
    private static void test1() {}
    private void test2() {}
    
    public void test3() {
        int c = 2;
        
        class LocalClass {
            static final int d = 4;
            void test4() {
                System.out.println(a + b + c + d);
                test1();
                test2();
            }
        }
        
        new LocalClass().test4(); 
    }
}

相关文章

  • Kotlin内联类、内部类、嵌套类

    Kotlin内联类、内部类、嵌套类 在开始介绍Kotlin内联类、内部类、嵌套类之前,先简要回顾一下java中的内...

  • java-内部类的创建

    java 创建内部类时离不开他的外围类,除非内部类是嵌套类(即静态内部类),嵌套类中的内部类也是如此 比如: pu...

  • Java 内部类(嵌套类)和局部类

    嵌套类 定义在另一个类中的类,就叫嵌套类。在嵌套类外层的累,称为:外部类最外层的外部类,称为:顶级类 嵌套类又分为...

  • 内部类

    慎用内部类 所谓内部类就是在一个类内部进行其他类结构的嵌套操作 Java内部类的定义、如何创建内部类、内部类的分类...

  • 【Java】内部类与外部类的互访使用小结

    原博客链接:【Java】内部类与外部类的互访使用小结 内部类又称为嵌套类。可以把内部类理解为外部类的一个普通成员。...

  • kotlin和Java内部类和嵌套类

    Java中的内部类和嵌套类 以上的形式即是内部类。我们可以发现,内部类持有了外部类的引用,我们可以在内部类中调用s...

  • 《Kotlin 实战》- 4 类、对象和接口

    4.1.4 内部类和嵌套类:默认是嵌套类 默认情况下 Kotlin 的嵌套类不能访问外部类的实例(不持有外部类的引...

  • Java中的内部类

    #内部类的定义 Java中允许在类中定义另一个类,这个定义在其他类内部的类就是内部类(嵌套类),包含内部类的类也被...

  • 内部类、枚举类

    内部类 在类中也可以定义类,默认是public,成为嵌套类 嵌套类用关键字inner标记,称为内部类。 内部类可以...

  • PHP转JAVA的记录

    Java 数组 内部类 内部类的创建:内部类可以对包内其他类隐藏想实现一个接口时, 不想新建类文件 内部类可以访问...

网友评论

      本文标题:Java 内部类(嵌套类)和局部类

      本文链接:https://www.haomeiwen.com/subject/utgxsktx.html