5. 内部类

news/2024/7/2 22:58:30

内部类

在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类。

1、实例内部类

即未被static修饰的成员内部类。

//外部类
class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    public static int  data3 = 3;

    public OuterClass() {
        System.out.println("外部类的构造方法!");
    }



//    内部类
    class InnerClass {
        public int data1 = 1111;
        public int data4 = 4;
        private int data5 = 5;
        public static final int data6 = 6;

    public InnerClass() {
        System.out.println("内部类构造方法!");
    }

    public void printInnerclass() {
        System.out.println("内部类成员方法打印:"+data1+data2+data3+data4+data5);
        System.out.println("内部类的data1:"+data1);
        System.out.println("外部类的data1:"+OuterClass.this.data1);
    }
}
public void printOuterclass() {
        System.out.println("外部类成员方法打印:"+data1+data2+data3);
    }
}


public class Test {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.printOuterclass();

        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.printInnerclass();
    }

}

注意事项:

  1. 外部类中的任何成员都可以被在实例内部类方法中直接访问
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员来访问
  4. 实例内部类对象必须在先有外部类对象前提下才能创建
  5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
  6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建外部类的对象。

实例内部类
1、实例内部类当中 不能定义静态的成员变量??
       ~~~~~~       如果定义   ~  那么这个静态的成员应该是被final修饰的
     ~~~~     
2、实例内部类当中   ~  不能定义静态的成员方法!!!
     ~~~~     
3、如何实例化    ~~   实例内部类??
     ~~~~     
外部类类名.内部类      ~~~~     变量      ~~~~     =      ~~~~     外部类引用.new      ~~~~     内部类();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
       ~~~~~~       
4、如何访问实例内部类   ~     ~  外部类的同名的成员变量??
       ~~~~~~       OuterClass.this
       ~~~~~~       实例内部类当中   ~  包含外部类的this
       ~~~~~~       
5、如果是同名的静态的,OuterClass.data3

       ~~~~~~       
       ~~~~~~       

2、静态内部类

  ~  static   ~  修饰的内部成员类称为静态内部类。

/**
 * 静态内部类:
 *
 */

class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    private static int data3 = 3;

    public void test() {
        System.out.println(data1+data2+data3);
    }

    /**
     * 1、如何拿到静态内部类的对象???
     * OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
     *
     * 2、不能在静态内部类当中,直接访问外部类非静态成员
     */

    static class InnerClass {
        public int data4 = 4;
        private int data5 = 5;
        private static int data6 = 6;

        public InnerClass() {
            System.out.println("静态内部类的构造方法!");
        }

        public void test() {
            System.out.println("test方法执行了!!");
//            如何拿到外部类的非静态成员呢??
            OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);
            System.out.println(outerClass.data2);
        }
    }
}

public class Test3 {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.test();

    }
}

       ~~~~~~       
       ~~~~~~       

局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法
格式。

/**
 * 局部内部类
 */
public class Test4 {
    public static void func() {
        class A {
            public void test() {
                System.out.println("局部内部类!!!");
            }
        }

        A a = new A();
        a.test();
    }

    public static void main(String[] args) {
        func();
    }
}

实际用的并不多,仅做了解即可

注意

  1. 局部内部类只能在所定义的方法体内部使用
  2. 不能被public、static等修饰符修饰
  3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$内部类名字.class
  4. 几乎不会使用

匿名内部类

后面了解


http://www.niftyadmin.cn/n/3032411.html

相关文章

@Bean 注解

Configuration 以及其中的 Bean 注解 Configuration 注解: Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Configuration {String value() default ""; } 从定义来看, Configuration 注解是用 Component 注解…

poj 3613(最短路)

题意&#xff1a;求解经过不多于某边数的最短路 思路&#xff1a;矩阵连乘&#xff0c;乘的次数就是不多于某边数的最短路&#xff0c;题目给出的顶点需要映射处理 View Code 1 #include<iostream>2 #include<map>3 #include<stdio.h>4 #include<string.…

Netty——BIO,NIO,AIO精讲

目录 0、总结&#xff1a; 一、BIO(Blocking IO) 同步阻塞模型&#xff0c; 二、NIO(Non Blocking IO) 同步非阻塞 三、AIO(NIO 2.0) 异步非阻塞 BIO、 NIO、 AIO 对比&#xff1a; 0、总结&#xff1a; 1、BIO(Blocking IO)同步阻塞模型&#xff0c;一个客户端连接对应一个处理…

6. 抽象类和接口

1. 抽象类 当我们的方法没有具体的实现,那么这个时候我们可以将这个方法定义为抽象方法,把定义这个方法的类定义为抽象类. //抽象类 public abstract class Shape {public int a;public static int b ;public void func() {}//抽象方法abstract public void draw();}使用 abs…

jsp到servletURL编码问题

在servlet中获取的jsp表单内容 java.net.URLDecoder.decode(body,"UTF-8");用这个方法进行编码就能获取到中文字符了.转载于:https://www.cnblogs.com/wysAC666/p/10361286.html

Netty02——核心功能与线程模型精练

目录 一、Netty初探 1.1、Netty的使用场景&#xff1a; 二、Netty线程模型 三、Netty模块组件 四、Netty通讯示例 五、ByteBuf详解 六、Netty实战聊天室系统 一、Netty初探 NIO 的类库和 API 繁杂&#xff0c; 使用麻烦&#xff1a; 需要熟练掌握Selector、 ServerSock…

轻量级流程图控件GoJS最新版本v2.1.42发布,十项功能修复 | 附下载

GoJS是一款功能强大&#xff0c;快速且轻量级的流程图控件&#xff0c;可帮助你在JavaScript 和HTML5 Canvas程序中创建流程图&#xff0c;且极大地简化您的JavaScript / Canvas 程序。 点击下载GoJS最新版 如果您对该图表控件感兴趣&#xff0c;欢迎加入图表控件QQ交流群&…

移动互联网服务客户端开发技巧系列

基于网络的客户端开发技巧——第一篇http://www.1000phone.net/thread-8058-1-1.html基于网络的客户端开发技巧——第二篇Webview及正则http://www.1000phone.net/thread-8061-1-1.html基于网络的客户端开发技巧——第三篇上下拖动切换页面http://www.1000phone.net/thread-806…