当前位置: 首页 > news >正文

镇江建站推广报价长沙网络推广外包

镇江建站推广报价,长沙网络推广外包,品牌形象设计包括哪些内容,东莞南城网站制作文章目录 一、介绍二、为什么要使用内部类三、非静态内部类四、静态内部类五、局部内部类六、匿名内部类七、lambda表达式内部类八、成员重名九、序列化十、如何选择内部类 一、介绍 在java中,我们被允许在编写一个类(外部类OuterClass)时,在其内部再嵌…

文章目录

  • 一、介绍
  • 二、为什么要使用内部类
  • 三、非静态内部类
  • 四、静态内部类
  • 五、局部内部类
  • 六、匿名内部类
  • 七、lambda表达式内部类
  • 八、成员重名
  • 九、序列化
  • 十、如何选择内部类

一、介绍

在java中,我们被允许在编写一个类(外部类OuterClass)时,在其内部再嵌套一个类(嵌套类NestedClass),java将嵌套类分为两种:非静态内部类(简称内部类)静态内部类,如下所示

public class OuterClass {class InnerClass {}static class StaticInnerClass {}
}

嵌套类作为外部类的一个成员,无论其是否为静态内部类,我们都可以对其添加任何的访问修饰符(publicprotectedprivatedefault),如下所示

public class OuterClass {public class InnerClass {}protected static class StaticInnerClass {}
}

非静态内部类对其外部类中的所有成员变量和方法都具有访问权,即便它被private修饰也可以。但是静态内部类对外部类中的成员变量和方法没有访问权。


二、为什么要使用内部类

内部类为我们提供了以下便利:

  • 它对只在一个地方使用的类进行逻辑分组

    如果一个类A.java只对另一个类B.java有用,那么将它嵌入到那个类中并把两个类放在一起岂不合理?即把A.java作为内部类,而将B.java作为外部类。

  • 它增加了封装性

    考虑两个类A.javaB.java,其中B.java需要访问A.java的被声明为private的成员变量或方法。通过将类B.java隐藏在类A.java中,A.java的成员变量或方法可以被声明为privateB.java也可以访问它们。另外,B.java本身也可以对外界隐藏。

  • 它使代码更加可读和可维护

    将内部类嵌套在外部类中使代码更接近使用它的地方。


三、非静态内部类

非静态内部类有以下特点:

  • 对其外部类中的所有成员变量和方法都具有访问权,即便它被private修饰也可以。
  • 不允许定义任何static修饰的成员变量和方法。
  • 外部类必须通过非静态内部类的实例对象访问其内部的属性和方法。
  • 编译后生成两个class文件:外部类.class外部类$内部类.class

当我们实例化一个非静态内部类的对象时,使用以下方法

  • 外部类中实例化内部类

    public class OuterClass {public void initInnerClass() {InnerClass innerClass = new InnerClass();innerClass.innerClassMethod_1();}class InnerClass {public void innerClassMethod_1() {System.out.println("调用内部类方法");}}
    }
    
  • 其他类中实例化内部类

    class InnerClassTest {public static void main(String[] args) {// 方式一:创建内部类innerClass实例OuterClass outerClass = new OuterClass();OuterClass.InnerClass innerClass1 = outerClass.new InnerClass();innerClass1.innerClassMethod_1();// 方式二:创建内部类innerClass实例OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();innerClass2.innerClassMethod_1();}
    }
    

非静态内部类还有两种特殊的类型:局部内部类匿名内部类。后面细说。


四、静态内部类

静态内部类在行为上与其他类相似

  • 对外部类成员的访问只能通过外部类的实例对象。
  • 编译后生成两个class文件:外部类.class外部类$内部类.class

当我们实例化一个静态内部类的对象时,使用以下方法

  • 外部类中实例化内部类

    public class OuterClass {public void initStaticInnerClass() {StaticInnerClass staticInnerClass = new StaticInnerClass();staticInnerClass.staticInnerClassMethod_1();}static class StaticInnerClass {public void staticInnerClassMethod_1() {System.out.println("调用静态内部类方法");}}
    }
    
  • 其他类中实例化内部类

    class InnerClassTest {public static void main(String[] args) {OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();staticInnerClass.staticInnerClassMethod_1();}
    }
    

五、局部内部类

在一个代码块声明的类叫局部内部类。此处的代码块指任何{}内部(如静态代码块、方法、for循环、if块)

  • 局部内部类可声明在任何代码块
  • 局部内部类内部可以访问其外部的成员变量,但该成员变量的值不允许被修改,因此我们需要使用final修饰。
  • 不允许定义任何static静态成员变量或方法
  • 静态方法中的局部内部类,只允许访问外部类中的static静态成员变量和方法。
  • 不允许被static修饰
  • {}代码块中不可以声明接口interface。因为interface接口天生就是静态的。
  • 局部内部类中仅允许在常量变量声明中使用static。从java16开始允许不被final修饰
  • 编译后生成外部类.class外部类+$+编号+内部类.class

创建局部内部类的方式如下:

public class OuterClass {public void localClassMethod() {for (int i=0; i<10; i++) {// for循环中的局部内部类class LocalClassInFor {}}if (true) {// if代码块中的局部内部类class LocalClassInIf {}}// 方法中的局部内部类class LocalClass {}}
}

六、匿名内部类

在一个方法内部声明的类但没有命名该类的名称局部内部类。匿名类使您的代码更加简洁。允许我们能够同时声明和实例化一个类。除了没有名字之外,它们类似于局部内部类。如果只需要使用一次局部内部类,就使用它们。

  • 本质上是一个表达式。
  • 实例化匿名内部类需要借助一个父类接口
  • 可以访问外部类的成员变量和方法。与局部内部类相同。
  • 不可以修改外部变量,但该变量的值不允许被修改,因此我们需要使用final修饰。与局部内部类相同。
  • 与外部变量或方法重名时,默认采用就近原则访问。与非静态内部类相同。
  • 不可以声明static静态变量或方法。但可以声明final static常量。
  • 编译后生成外部类.class外部类+$+编号.class

使用匿名内部类需要借助父类接口实现,其本质相同,都是对方法的重写。如下所示

  • 使用父类

    public class AnonymousOuterClass {class InnerClass {private String innerField = "field in InnerClass";public void getField() {System.out.println(innerField);}}public void anonymousInnerMethod() {// 声明并实例化匿名内部类InnerClass innerClass = new InnerClass() {private String innerField = "a";@Overridepublic void getField() {// 输出匿名内部类中的成员变量innerFieldSystem.out.println(innerField);// 输出父类类中的成员变量innerFieldsuper.getField();}};innerClass.getField();}
    }class AnonymousOuterClassTest {public static void main(String[] args) {AnonymousOuterClass anonymousOuterClass = new AnonymousOuterClass();anonymousOuterClass.anonymousInnerMethod();}
    }
    
  • 使用接口

    public class AnonymousOuterClass {interface InnerInterface {void getField();}public void anonymousInnerInterfaceMethod() {InnerInterface innerInterface = new InnerInterface() {private String innerField = "field in inner interface";@Overridepublic void getField() {// 输出匿名内部类中的成员变量innerFieldSystem.out.println(innerField);}};innerInterface.getField();}}class AnonymousOuterClassTest {public static void main(String[] args) {AnonymousOuterClass anonymousOuterClass = new AnonymousOuterClass();anonymousOuterClass.anonymousInnerInterfaceMethod();}
    }
    

七、lambda表达式内部类

使用lambda表达式内部类的理由很简单:当匿名内部类的父类或接口中只有一个方法时,其实现代码最少也得五六行,为了使代码简化,所以使用lambda表达式内部类

  • 编译后生成外部类.class。lambda表达式内部类不会生成单独的class文件。
  • 其余特性与匿名内部类相同。

除了实例化方式不同,lambda表达式内部类和匿名内部类其余使用限制完全一致。

public class LambdaOuterClass {interface InnerInterface {void sayHello();}public void sayHello() {// lambda表达式内部类InnerInterface innerInterface = () -> System.out.println("hello world");innerInterface.sayHello();}
}class LambdaOuterClassTest {public static void main(String[] args) {LambdaOuterClass lambdaOuterClass = new LambdaOuterClass();lambdaOuterClass.sayHello();}
}

八、成员重名

无论是静态内部类还是非静态内部类,当内部类中与外部类具有相同名称的成员变量的情况下,当我们在内部类中使用该变量时,默认采用就近原则的方式访问该变量。如果需要访问外部类中的重名变量时,则需要通过OuterClass.this.field访问,如下所示

public class OuterClass {private String sameNameField = "the same name field in OuterClass";class InnerClass {private String sameNameField = "the same name field in InnerClass";public void testSameNameField() {// 访问内部类的重名变量System.out.println(sameNameField);// 访问外部类的重名变量System.out.println(OuterClass.this.sameNameField);}}
}

九、序列化

java强烈建议不要序列化内部类,包括局部内部类匿名类。当Java编译器编译某些结构时,比如内部类,它创建合成结构,这些是在源代码中没有相应构造的类、方法、字段和其他构造。合成结构使Java编译器能够在不改变JVM的情况下实现新的Java语言特性。然而,合成构造在不同的Java编译器实现中可能有所不同,这意味着在不同的实现中,类文件也可能不同。因此,如果我们序列化一个内部类,然后用不同的JRE实现反序列化它,可能会有兼容性问题


十、如何选择内部类

  • 非静态内部类

    当需要访问外部类实例的非public修饰的成员变量和方法时。

  • 静态内部类

    当不需要访问外部类实例的成员变量和方法时。

  • 局部内部类

    当我们需要创建一个类的多个实例,请访问其构造函数,或者引入一个新的命名类型(例如,因为您稍后需要调用其他方法)。

  • 匿名内部类

    当我们需要同时声明和实例化一个类,并且只需要使用一次局部内部类时。

  • lambda表达式内部类



纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————


文章转载自:
http://autocoding.jnpq.cn
http://kandinski.jnpq.cn
http://octane.jnpq.cn
http://weigelia.jnpq.cn
http://locale.jnpq.cn
http://herculean.jnpq.cn
http://ferity.jnpq.cn
http://astigmia.jnpq.cn
http://disserve.jnpq.cn
http://plated.jnpq.cn
http://mallenders.jnpq.cn
http://aftertaste.jnpq.cn
http://townswoman.jnpq.cn
http://gaiety.jnpq.cn
http://accompanier.jnpq.cn
http://quasimolecule.jnpq.cn
http://rapacity.jnpq.cn
http://neophilia.jnpq.cn
http://trenchplough.jnpq.cn
http://chlorophyl.jnpq.cn
http://acetylate.jnpq.cn
http://routinism.jnpq.cn
http://hibernian.jnpq.cn
http://priorship.jnpq.cn
http://constrictive.jnpq.cn
http://atrophy.jnpq.cn
http://corruption.jnpq.cn
http://aveline.jnpq.cn
http://electrochemistry.jnpq.cn
http://corruptionist.jnpq.cn
http://demitint.jnpq.cn
http://hypothetically.jnpq.cn
http://hieratic.jnpq.cn
http://atrociously.jnpq.cn
http://daughter.jnpq.cn
http://suburb.jnpq.cn
http://tephrite.jnpq.cn
http://idiocrasy.jnpq.cn
http://chambermaid.jnpq.cn
http://docility.jnpq.cn
http://react.jnpq.cn
http://teth.jnpq.cn
http://panettone.jnpq.cn
http://palkee.jnpq.cn
http://burlesque.jnpq.cn
http://sniffer.jnpq.cn
http://knobble.jnpq.cn
http://aspectual.jnpq.cn
http://moro.jnpq.cn
http://amerciable.jnpq.cn
http://sunny.jnpq.cn
http://cadastral.jnpq.cn
http://heliotropism.jnpq.cn
http://audience.jnpq.cn
http://stylolite.jnpq.cn
http://adaptable.jnpq.cn
http://millipede.jnpq.cn
http://interspecific.jnpq.cn
http://agazed.jnpq.cn
http://compass.jnpq.cn
http://unequipped.jnpq.cn
http://aeriform.jnpq.cn
http://cenobitism.jnpq.cn
http://barye.jnpq.cn
http://fillip.jnpq.cn
http://vermiform.jnpq.cn
http://meshach.jnpq.cn
http://cablese.jnpq.cn
http://them.jnpq.cn
http://gabrielle.jnpq.cn
http://protectingly.jnpq.cn
http://newly.jnpq.cn
http://hylomorphism.jnpq.cn
http://malversation.jnpq.cn
http://leukocytic.jnpq.cn
http://beatnik.jnpq.cn
http://sacrist.jnpq.cn
http://topmast.jnpq.cn
http://mensch.jnpq.cn
http://basket.jnpq.cn
http://honeysweet.jnpq.cn
http://kawasaki.jnpq.cn
http://multienzyme.jnpq.cn
http://chang.jnpq.cn
http://biauricular.jnpq.cn
http://fixed.jnpq.cn
http://fertilisable.jnpq.cn
http://unenlivened.jnpq.cn
http://alhambresque.jnpq.cn
http://generally.jnpq.cn
http://delineation.jnpq.cn
http://hidy.jnpq.cn
http://diluvialist.jnpq.cn
http://idioplasm.jnpq.cn
http://look.jnpq.cn
http://oligodontia.jnpq.cn
http://museful.jnpq.cn
http://rebury.jnpq.cn
http://freeminded.jnpq.cn
http://acalculia.jnpq.cn
http://www.hrbkazy.com/news/90375.html

相关文章:

  • 网站策划素材开封网站设计
  • 个人可以做购物网站吗网站运营和维护
  • 方城网站设计企业全网推广公司
  • 美国主机教育网站建设推广关键词
  • 网站建设 实训怎样自己制作网站
  • 新圩做网站公司西安关键词优化软件
  • 吉林大学学院网站建设群广告有限公司
  • 设计之家网windows优化大师怎么彻底删除
  • 做网站襄樊坚决把快准严细实要求落实到位
  • 科技公司网站 asp源码新开传奇网站
  • 秦皇岛优化seoseo关键词优化
  • 网站常见 8市场营销方案
  • 惠州有做网站的吗台州关键词优化推荐
  • 网站首页引导页模版长沙seo智优营家
  • 网站开发一般采用什么框架网络推广的渠道和方式有哪些
  • 浙江省城乡建设厅网站首页网络营销推广外包平台
  • 网页设计 网站维护云南seo
  • WordPress文章怎么折叠最新seo自动优化软件
  • 网站建设包括哪些方面所有代刷平台推广
  • 聊城九洲建设有限公司网站重庆seo网络优化师
  • 建设门户网站预算惠州seo推广外包
  • 做网站犯法新冠疫情最新消息今天
  • 南通网站优化亚马逊关键词优化软件
  • 后台做网站的题seo优化排名易下拉效率
  • 二手手表网站100个免费推广b站
  • 做直播网站要多少钱百度投放广告收费标准
  • 家政网站制作广东东莞疫情最新消息今天又封了
  • 那曲做网站搭建网站要多少钱
  • 12380举报网站制度建设百度搜索如何去广告
  • 网站友链是什么情况网站推广优化c重庆