zoukankan      html  css  js  c++  java
  • Java——内部类

    一、概念

    一个类A内部定义了一个类B,那么B就是A的内部类。A可以称为外部类。

    二、成员内部类的定义

    类中方法外定义的类,我们称为成员内部类。

    class Outer{
       class Inner{
    
       }
    }
    

    如果要描述两个事物,这两个事物存在包含关系,就可以使用内部类。人与心的关系;汽车与引擎的关系。

    三、成员内部类对象的使用

    内部类的类型表示:外部类名.内部类名

    成员内部类创建对象,需要借助外部类的对象,如下

    外部类名.内部类名 变量 = 外部类对象.new 内部类构造方法(参数);
    

    代码示例

    // Person.java
    public class Person {
        class Heart{
            private int rate;
    
            public void beats(){
                System.out.println("咚咚咚");
            }
        }
    }
    
    // Test.java
    public class Test {
        public static void main(String[] args) {
            Person.Heart heart = new Person().new Heart();
            heart.beats();   // 咚咚咚
        }
    }
    

    四、内部类访问外部类成员

    • 成员内部类的方法中默认存在一个外部类对象:外部类名.this。可用此格式来调用外部类成员,访问时如果没有冲突格式可省略,如果有冲突就不能省略了。
    • 对于外部类来讲,没有默认的内部类对象的,如果要访问内部类的成员,需要创建内部类对象。

    例子

    // Person.java
    public class Person {
        private String name = "张三";
        private int num = 30;   // 外部类成员变量
        class Heart{
            private int rate;
            private int num = 20;   // 内部类成员变量
            public void beats(){
                int num = 10;   // 内部类方法中的局部变量
                System.out.println(num);   // 10
                System.out.println(this.num);   // 20
                System.out.println(Person.this.num);   // 30
            }
        }
    }
    
    // Test.java
    public class Test {
        public static void main(String[] args) {
            Person.Heart heart = new Person().new Heart();
            heart.beats();
        }
    }
    

    五、匿名内部类

    匿名内部类是一个非常特殊的内部类,从命名可以看出,匿名内部类是没有类名,因此这个内部类只能用一次。匿名内部类一般用于简化代码,当要快速实现一个抽象方法时,我们就可以使用匿名内部类来简化,可以不用专门定义一个有名类来操作。所以,要使用匿名内部类,必须要有一个父类或者父接口。

    六、匿名内部类的定义格式

    new 类名/接口(){
       // 如果父类型有抽象方法,需要全部重写
    }
    

    七、匿名内部类的使用

    使用父类型变量多态接收该匿名子类对象,以匿名对象的方式使用

    • 直接调用方法使用
    • 当做方法的参数传递
    • 当做方法的返回值使用
  • 相关阅读:
    团队冲刺(九)
    TensorFlow利用Keras实现线性回归
    Spark Streaming 编程初级实践
    Spark SQL 编程初级实践
    解决Ubuntu输入正确密码后进不去桌面
    RDD 编程初级实践
    A master URL must be set in your configuration at org.apache.spark.SparkContext.<init>(SparkContext.
    TensorFlow加载mnist数据集并显示
    Spark读取文件统计行数
    【测试技能】服务端测试就是postman看接口和操作redis吗?
  • 原文地址:https://www.cnblogs.com/xulinjun/p/14768247.html
Copyright © 2011-2022 走看看