`

内部类小结

 
阅读更多
https://mp.weixin.qq.com/s/hErv4X9Whl_Juq8-TDhzdg

什么我们需要使用内部类了?



内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。

内部类可以对同一包中的其他类隐藏起来。

当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较快捷。

内部类所实现得到功能使用外部类同样可以使用,只是在特定场景使用内部更加方便。比如:有时候一个类只需要在一处代码中使用一次,其他位置不会用到这个类,这时使用匿名内部类来解决,代码更加简洁。



01、成员内部类



成员内部类是最普通常见的内部类,它常定义于另外一个类的内部。如代码1所示。

1

public class Outter {

    private String name = "Java敲黑板";

    private static int age = 1;


    //成员内部类的定义

    class inner{

public void print(){

    System.out.println("name: "

            + name + ",age:" + age);

    }

}



public static void main(String[] args){

    //编译错误

    //inner in = new inner();



    //编译错误

    //inner in = new Outter.inner();



    //成员内部的正确打开方式

    Outter out = new Outter();

    inner in = out.new inner();

    in.print();

    }

}



敲黑板

成员内部类可以无条件的访问外部内的所有成员(包括private、static等)

外部内如果要访问内部类的成员,必须先创建一个成员内部类的对象,再通过这个对象引用来访问。



02、局部内部类



局部内部类是定义在一个方法或者一个作用域里面的类。如代码2所示。



2

public void outPrint(){

    //局部内部类定义在一个方法函数中

    class inner{

public void print(){

    System.out.println("name: "

    + name + ",age:" + age);

    }

}



//定义了局部内部类的对象引用

inner in = new inner();

//利用对象引用访问方法

in.print();

}



敲黑板

局部内部类和成员内部类的区别在于,前者作用域仅局限于方法内。

局部内部类有一个优势,即对外部世界可以完全地隐藏起来。

局部内部类不能用public、protected、private以及static修饰符的。



03、匿名内部类



匿名内部类是只需要为内部类建立一个对象,且不用为该类指定一个类名。如代码3所示。匿名内部类可用于以下业务场景:

只用到类的一个实例;

类在定义后马上用到;

类非常小(比如类代码在10行以下)。



3

public class ListenerTest {

    public interface MouseListener{

        public void onMouseClick();

    }



    public static void main(String[] args){

//定义一个匿名内部类

MouseListener m = new MouseListener(){

    @Override

    public void onMouseClick() {

System.out.println("Mouse clicked!");

    }

};

//调用方法

m.onMouseClick();

    }

}



敲黑板

由于匿名内部类没有名称,因此在创建匿名内部类对象时,new运算符后是超类或接口的名称,其后面的{}内部为匿名类的定义。

匿名类对象的创建与匿名内部类的定义是在一起完成的。



04、静态内部类



静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。如代码4所示。



4


public class Outter1 {

    //定义静态内部类

    static class innner{

public void print(){

    System.out.println("Hello world!");

}

    }



    public static void main(String[] args) {

//编译错误

//inner in = new inner();



Outter1 out = new Outter1();



//编译错误

//inner in1 = new out.inner();



//静态内部类的正确打开方法

innner in2 = new Outter1.innner();

in2.print();

    }

}



敲黑板

当内部类不需要访问外围类对象的时候,应该使用静态内部类。

静态内部类,只能访问外部类的静态成员。
分享到:
评论

相关推荐

    Java中的匿名内部类小结

    Java中的匿名内部类是Java语言的一个独特特性,它允许我们在编写代码时,无需定义一个完整的类,而是直接在需要的地方创建一个类的实例。这种方式在处理简单且仅需使用一次的类实现时非常方便,可以有效减少代码量,...

    java接口与内部类

    #### 小结 - **接口**是Java中用于定义行为规范的重要工具,它增强了程序的扩展性和灵活性。 - **内部类**则提供了更加灵活的面向对象编程方式,能够更好地组织和复用代码。 - 通过理解和应用接口与内部类的概念,...

    JAVA语法总结 - 内部类

    #### 七、小结 内部类为Java程序设计提供了强大的灵活性和封装能力。理解不同类型的内部类以及它们之间的差异对于编写高质量的Java代码至关重要。通过合理使用内部类,开发者可以更好地组织代码逻辑,提高代码的...

    Java中类的继承学习小结

    下面是对"Java中类的继承学习小结"的详细讲解。 首先,类的继承使用关键字`extends`来实现。子类(也称为派生类)声明时,会指定一个父类(或超类): ```java public class DerivedClass extends BaseClass { //...

    软件测试方法小结

    软件测试方法小结 ...软件测试方法小结涵盖了划分等价类、边界值分析、语句覆盖、判定覆盖、条件覆盖、路径覆盖、判定-条件覆盖、功能测试的常用方法、界面测试的常用方法等方面,为软件测试提供了一个全面的指南。

    python类与对象小结

    而以双下划线开头的成员则被认为是私有成员,它们只能在类内部被访问。尽管如此,通过类名和双下划线的组合仍然可以访问到私有成员。 6. 继承:继承是面向对象编程的另一个重要特性。通过继承,子类可以扩展父类的...

    安卓知识小结第一章

    【Android知识小结第一章】 本章节主要涵盖了Android开发中的一些核心知识点,特别是针对面试中常见的问题进行了总结。以下是对这些知识点的详细解释: 1. 开启多进程:在Android中,可以通过在AndroidManifest....

    类的使用,学习,小结 java定义一个学生类

    成员变量`a`被声明为`private`,这意味着它只能在类的内部被访问,不能从类的外部直接访问,这是Java中的封装特性。`print()`方法没有参数,而`print(double a)`方法接受一个`double`类型的参数,并打印出传入的值。...

    Flutter部件内部状态管理小结之实现Vue的v-model功能

    Flutter的部件分为两种类型:无状态widget(StatelessWidget)和有状态widget(StatefulWidget),每种类型的widget管理内部状态的方式不同。 无状态widget是不可变的,即一旦创建,其内部的成员变量就不能更改,...

    银行业务系统小结

    ### 银行业务系统小结 #### 一、银行业务系统基础知识 银行业务系统是银行内部处理各类金融交易和客户信息的复杂网络,涵盖了从账户管理、交易处理到风险管理等多个方面。为了确保数据的准确性和系统的高效运行,...

    Java语言基础小结

    ### Java语言基础小结 #### 一、JDK, JRE, JVM的关系 - **JVM(Java Virtual Machine)**:Java虚拟机是Java程序跨平台运行的核心,它负责执行Java字节码(.class文件),确保Java程序可以在不同的平台上运行而...

    com组件学习小结

    ### COM组件学习小结 #### 一、COM组件与MATLAB和VC++混合编程 COM(Component Object Model),即组件对象模型,是一种用于构建应用程序组件的技术。它允许不同语言编写的程序之间进行通信,实现跨语言、跨平台的...

    JAVA程序:接口小结

    7. **接口的实例化**:虽然接口不能被实例化,但是可以通过匿名内部类或者Lambda表达式来实现接口,并创建其实例。 8. **接口与泛型**:接口可以作为泛型的边界,限制实现接口的类的类型参数。 9. **接口与回调**...

    Java(J2SE、J2EE)学习小结

    6. 内部类:内部类分为成员内部类、局部内部类、匿名内部类和静态内部类。内部类可以直接访问外部类的私有成员,但静态内部类不能直接访问外部类的非静态成员。 7. 垃圾回收机制:Java的垃圾回收自动管理内存,避免...

    RMI入门小结

    这篇博客“RMI入门小结”主要探讨了RMI的基础概念、实现步骤以及常见问题。 1. RMI的基本原理: RMI的核心是通过接口定义服务,服务端实现接口,并将实现类注册到RMI注册表中。客户端通过引用远程接口,即可调用...

    java集合小结

    ### 小结 Java集合框架为开发者提供了丰富的数据结构选择,每种数据结构都有其特定的优势和适用场景。理解这些集合的内部实现机制和性能特点,对于编写高效、可维护的代码至关重要。当面临具体问题时,应根据数据的...

    资产管理员工作小结2篇 (2).docx

    通过这两篇工作小结,我们可以看到,资产管理员在组织内部管理中的作用是多方面的。他们需要对资产状况有着深刻的理解,对流程有着清晰的规划,并且具备出色的组织协调能力和解决问题的能力。这些关键知识点不仅为...

    ASMEⅧ-Ⅰ容器设计小结[汇编].pdf

    A类、B类、C类和D类接头代表了不同的焊接接头位置和形式,其强度直接影响到容器的整体安全性。接头系数E是根据焊接方法确定的,它与接头的实际强度评估息息相关。设计时必须严格按照规范选取合适的接头类型和系数,...

    FPGA总结,个人心得体会小结

    FPGA,全称为Field-Programmable Gate Array,是一种可编程逻辑器件,允许用户通过配置其内部的逻辑块和互连资源来实现特定的数字电路功能。以下是对FPGA相关知识点的详细阐述: 1. FPGA在系统中的角色:在复杂的...

    小结NT_Q&A.docx

    - 内存泄漏:非静态内部类或匿名内部类持有对外部类的引用,未处理的消息持有Handler引用,Handler又持有外部类(如MainActivity)的引用,可能导致内存泄漏,需要确保消息得到及时处理。 3. Android动画: - 帧...

Global site tag (gtag.js) - Google Analytics