zoukankan      html  css  js  c++  java
  • Java内部类使用总结

     1.定义

    内部类是指在一个外部类的内部再定义一个类。
    内部类作为外部类的一个成员,并且依附于外部类而存在的。
    内部类可为static,可用public、protected、private修饰。(而外部类不可以:外部类只能使用publi和default)。

    2.分类
    在一个类(外部类)中直接定义的内部类(成员内部类)、
    局部内部类、
    静态内部类、
    匿名内部类。

    3.使用方法

    A. 在一个类中直接定义的内部类

    1)      外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问。

    2)      内部类作为外部类的成员,可以访问外部类的所有成员。

    3)      注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。

    4)      成员内部类与普通的成员没什么区别,可以与普通成员一样进行修饰和限制。

    public class MyMain {

    int outer_x = 100;

    class Inner{
    //局部变量,其范围为定义它的代码块(不受修饰符的影响)。
    public int y = 10; //局部变量
    private int z = 9;
    int m = 5;
    //static int k=1;//内部类中不允许定义静态变量

    public void display1(){
    System.out.println("display outer_x:"+ outer_x);
    }

    private void display2(){
    System.out.println("display outer_x:"+ outer_x);
    }
    }

    void test(){
    Inner inner = new Inner();

    inner.display1();
    inner.display2();

    System.out.println("Inner y:" + inner.y);//可以访问
    System.out.println("Inner z:" + inner.z);//可以访问
    System.out.println("Inner m:" + inner.m);//可以访问
    }

    public static void main(String args[]){
    MyMain outer = new MyMain();
    outer.test();
    }
    }

    B. 在一个方法中定义的内部类

            在方法中定义的内部类称为局部内部类。与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。其他用法和成员内部类相同。

    C. 静态内部类

            静态内部类:不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。若想访问外部类的变量,必须通过其它方法解决,由于这个原因,静态嵌套类使用很少。

            静态内部类其实已经脱离了外部类。在创建静态内部类对象时也不需要外部类对象的存在。其实质是一个放置在别的类内部的普通类。而关键字static也只是说明其在创建对象时不依赖于外部类对象的存在,并不是说这个类本身是静态的。

    • 静态内部类与前面所讲的两种非静态内部类的语法基本相同。区别主要是在内部类的声明前面要加上static 关键字。另外,静态内部类也不可以用private进行定义。
    • 静态内部类的对象可以直接生成,而不需要外部类的对象来生成,这样实际上是使静态内部类成为了一个顶级类。这主要是因为静态内部类是外部类的静态成员,并不依赖于外部类的对象而存在。
    •  静态内部类与非静态内部类的区别是本质上的。非静态内部类是外部类对象组成的一部分,主要是辅助外部类对象工作的,与外部类对象存在这对成员变量的共享关系。

    D.匿名类

          匿名内部类是一种特殊的局部内部类,这种内部类没有类名。该类适用于只使用一次并且不需要多次创建对象的类。使用匿名内部类可以使类代码与创建对象同时完成,这样做不但方便,还提高代码的可维护性。

    • 匿名内部类是唯一一种没有构造方法的类。正因为其没有构造方法,所以匿名内部类的使用范围非常有限。
    • 大部分匿名内部类用于接口回调。
    • 匿名内部类在编译的时候由系统自动起名为Out$1.class
    • 匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

    语法规则:new <类或接口> <类的主体> 

    interface pr   
    {
    void print1();
    }

    public class noNameClass
    {
    public pr dest()
    {
    //这个用法的作用是:创建一个对象的实例,并且 override 它的一个函数,然后返回。
    return new pr(){
    public void print1() {
    System.out.println("Hello world!!");
    }
    };
    }

    public static void main(String args[])
    {
    noNameClass c=new noNameClass();
    pr hw=c.dest();
    hw.print1();
    }
    }

     --------------------------------------------------------------------

    PS: 欢迎关注公众号"Devin说",会不定期更新Java相关技术知识。

    --------------------------------------------------------------------

  • 相关阅读:
    【Django Admin皮肤】 Simpleui 自定义常用 持续更新中...
    【webSokect】基于django Channels的简单实现
    【webSocket】实现原理
    【webSocket】长轮询
    【前端实时时间】JS原生代码
    【数据结构的补全整理】规定在周一到周五中,赛选出8点到18点中的计划安排,空计划时刻补全空值
    JS面试经典知识(一)
    Python中 zipfile 出现乱码
    Linux shell 对数据进行归档
    Linux 函数的使用
  • 原文地址:https://www.cnblogs.com/devinzhang/p/2319193.html
Copyright © 2011-2022 走看看