Java内部类

Java内部类

转载自:BlueFish的学习笔记

(1)使用内部类的原因

每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响

(2)优点

  • 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独。
  • 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
  • 创建内部类对象的时刻并不依赖于外围类对象的创建。
  • 内部类并没有令人迷惑的“is-a”关系,它是一个独立的实体。
  • 内部类提供了更好的封装,除了该外围类,其他类都不能访问。

(3)分类

成员内部类(非静态内部类)

public class Outer{
        private int age = 99;
        String name = "Coco";
    
        public class Inner{
            String name = "Jayden";
            public void show(){
                //如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,
                //如果要访问外部类的成员变量,可以使用 this 关键字,如:Outer.this.name
                System.out.println(Outer.this.name); //输出外部类name:Coco
                System.out.println(name);//同名属性默认输出内部类属性:Jayden
                System.out.println(age);//没有同名属性则输出外部类属性:99
            }
        }
    
        public Inner getInnerClass(){
            return new Inner();
        }
        public static void main(String[] args){
            Outer o = new Outer();
            Inner in1 = o.new Inner();//内部类的创建
            Inner in2 = o.getInnerClass();//内部类的创建
            in1.show();
        }
    }
  • Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等

  • Inner 类中定义的 show() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性age

  • 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象

    • 即:内部类 对象名 = 外部类对象.new 内部类( );

      Inner in1 = o.new Inner();//内部类的创建
      Inner in2 = o.getInnerClass();//或者通过外部类提供的方法来创建

  • 编译上面的程序后,会发现产生了两个 .class 文件: Outer.class,Outer$Inner.class{}

  • 非静态内部类中不能存在任何 static 的变量和方法,可以定义常量:

    • 因为非静态内部类是要依赖于外部类的实例,而静态变量和方法是不依赖于对象的,仅与类相关

      简而言之:在加载静态域时,根本没有外部类,所在在非静态内部类中不能定义静态域或方法,编译不通过;非静态内部类的作用域是实例级别

补充

  • 外部类是不能直接使用内部类的成员和方法的,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法;
  • 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字,如:Outer.this.name

静态内部类

public class Outer{
            private int age = 99;
    	    static int num = 101;
            static String name = "Coco";
    
            public static class Inner{
                String name = "Jayden";
                public void show(){
                    System.out.println(new Outer().age);//静态内部类不能直接访问外部类的非静态属性
                    System.out.println(num);//不是同名属性,可直接通过“属性名”直接调用外部类的静态成员
                    System.out.println(Outer.name);//输出外部类属性:Coco
                    System.out.println(name);//默认输出内部类属性:Jayden                 
                }
            }
    
            public static void main(String[] args){
                Inner i = new Inner();//创建静态内部类的对象时,不需要外部类的对象
                i.show();
            }
        }
  • 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
  • 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;
    如果外部类的静态成员与内部类的成员名称不相同,则可直接通过“成员名”直接调用外部类的静态成员
  • 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名 = new 内部类();

方法内部类

**作用域:**其作用域仅限于方法内,方法外部无法访问该内部类

public class Outer {
    public void show() {
        final int a = 25;
        int b = 13;

        class Inner {
            int c = 2;
            public void print() {
                //只能访问方法中定义的 final 类型的局部变量
                //当方法被调用运行完毕之后,局部变量就已消亡。但内部类对象可能还存在
                //注意:在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的
                System.out.println("访问外部类:" + a);//访问外部类:25
                System.out.println("访问内部类:" + c);//访问内部类:2
            }
        }
        Inner i = new Inner();
        i.print();
    }
    
    public static void main(String[] args) {
        Outer o = new Outer();
        o.show();
    }
}  
  • 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的

  • 只能访问方法中定义的 final 类型的局部变量,当方法被调用运行完毕之后,局部变量就已消亡。但内部类对象可能还存在,直到没有被引用时才会消亡。此时就会出现一种情况,就是内部类要访问一个不存在的局部变量;

    使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期

    注意:在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的

匿名内部类

public class Outer {
    
    public Inner getInnerClass(final int num,String str2){
        return new Inner(){
            int number = num + 3;
            public int getNumber(){
                return number;
            }
        };//注意:分号不能省
    }
    
    public static void main(String[] args) {
        Outer out = new Outer();
        Inner inner = out.getInnerClass(2, "chenssy");
        System.out.println(inner.getNumber());//输出:5
    }
}

interface Inner {
    int getNumber();
}
  • 匿名内部类是直接使用 new 来生成一个对象的引用;

  • 对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,

    该类的定义会立即消失,所以匿名内部类是不能够被重复使用;

  • 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口;

  • 匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态成员变量和静态方法;

  • 匿名内部类中不能存在任何的静态成员变量和静态方法,匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法

  • 匿名内部类初始化:使用构造代码块,利用构造代码块能够达到为匿名内部类创建一个构造器的效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字乡村和智慧农业的数字化转型是当前农业发展的新趋势,旨在通过应用数字技术,实现农业全流程的再造和全生命周期的管理服务。中国政府高度重视这一领域的发展,提出“数字中国”和“乡村振兴”战略,以提升国家治理能力,推动城乡融合发展。 数字乡村的建设面临乡村治理、基础设施、产业链条和公共服务等方面的问题,需要分阶段实施《数字乡村发展战略纲要》来解决。农业数字化转型的需求包括满足市民对优质农产品的需求、解决产销对接问题、形成优质优价机制、提高农业劳动力素质、打破信息孤岛、提高农业政策服务的精准度和有效性,以及解决农业融资难的问题。 数字乡村建设的关键在于构建“1+3+4+1”工程,即以新技术、新要素、新商业、新农民、新文化、新农村为核心,推进数据融合,强化农业大数据的汇集功能。数字农业大数据解决方案以农业数字底图和数据资源为基础,通过可视化监管,实现区域农业的全面数字化管理。 数字农业大数据架构基于大数据、区块链、GIS和物联网技术,构建农业大数据中心、农业物联网平台和农村综合服务指挥决策平台三大基础平台。农业大数据中心汇聚各类涉农信息资源和业务数据,支持大数据应用。信息采集系统覆盖市、县、乡、村多级,形成高效的农业大数据信息采集体系。 农业物联网平台包括环境监测系统、视频监控系统、预警预报系统和智能控制系统,通过收集和监测数据,实现对农业环境和生产过程的智能化管理。综合服务指挥决策平台利用数据分析和GIS技术,为农业决策提供支持。 数字乡村建设包括三大服务平台:治理服务平台、民生服务平台和产业服务平台。治理服务平台通过大数据和AI技术,实现乡村治理的数字化;民生服务平台利用互联网技术,提供各类民生服务;产业服务平台融合政企关系,支持农业产业发展。 数字乡村的应用场景广泛,包括农业生产过程、农产品流通、农业管理和农村社会服务。农业生产管理系统利用AIoT技术,实现农业生产的标准化和智能化。农产品智慧流通管理系统和溯源管理系统提高流通效率和产品追溯能力。智慧农业管理通过互联网+农业,提升农业管理的科学性和效率。农村社会服务则通过数字化手段,提高农村地区的公共服务水平。 总体而言,数字乡村和智慧农业的建设,不仅能够提升农业生产效率和管理水平,还能够促进农村地区的社会经济发展,实现城乡融合发展,是推动中国农业现代化的重要途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值