首页 > 编程语言 >Java--内部类

Java--内部类

时间:2024-11-03 15:16:03浏览次数:3  
标签:部类 Java 内部 -- OutClass 实例 static public

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

1.1 实例内部类

即未被 static 修饰的成员内部类
public class OutClass {
        private int a;
        static int b;
        int c;
        public void methodA(){
            a = 10;
            System.out.println(a);
        }
        public static void methodB(){
            System.out.println(b);
        }
        // 实例内部类:未被static修饰
        class InnerClass{
            int c;
            public void methodInner(){
// 在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员
                a = 100;
                b =200;
                methodA();
                methodB();
// 如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类自己的
                c = 300;
                System.out.println(c);
// 如果要访问外部类同名成员时候,必须:外部类名称.this.同名成员名字
                OutClass.this.c = 400;
                System.out.println(OutClass.this.c);
            }
        }
        public static void main(String[] args) {
// 外部类:对象创建 以及 成员访问
            OutClass outClass = new OutClass();
            System.out.println(outClass.a);
            System.out.println(OutClass.b);
            System.out.println(outClass.c);
            outClass.methodA();
            outClass.methodB();
            System.out.println("=============实例内部类的访问=============");
// 要访问实例内部类中成员,必须要创建实例内部类的对象
// 而普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类
// 创建实例内部类对象
            OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
// 上述语法比较怪异,也可以先将外部类对象先创建出来,然后再创建实例内部类对象
            OutClass.InnerClass innerClass2 = outClass.new InnerClass();
            innerClass2.methodInner();
        }
}
注意事项 】 1. 外部类中的任何成员都可以在实例内部类方法中直接访问 2. 实例内部类所处的位置与外部类成员位置相同,因此也受 public 、 private 等访问限定符的约束 3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称 .this. 同名成员 来访问 4. 实例内部类对象必须在先有外部类对象前提下才能创建 5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用 6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象 实例内部类中不可以定静态的成员方法--类在加载的时候不会加载普通成员,实例内部类中又存在static,static是在类加载的时候创建的 获取实例内部类时,依赖于外部类对象 实例内部类当中包含外部类的this public static final int 常量

 

1.2 静态内部类

被 static 修饰的内部成员类称为静态内部类
 public class OutClass {
            private int a;
            static int b;
            public void methodA(){
                a = 10;
                System.out.println(a);
            }
            public static void methodB(){
                System.out.println(b);
            }
            // 静态内部类:被static修饰的成员内部类
            static class InnerClass{
                public void methodInner(){
// 在内部类中只能访问外部类的静态成员
// a = 100; // 编译失败,因为a不是类成员变量
                    b =200;
// methodA(); // 编译失败,因为methodB()不是类成员方法
                    methodB();
                }
            }
            public static void main(String[] args) {
// 静态内部类对象创建 & 成员访问
                OutClass.InnerClass innerClass = new OutClass.InnerClass();
                innerClass.methodInner();
//在静态内部类中访问外部类的非静态的数据成员
                OutClass.outclass = new OutClass(); 
                System.out.println(outclass.a);
            }
        }
注意事项 】 1. 在静态内部类中只能访问外部类中的静态成员 2. 创建静态内部类对象时,不需要先创建外部类对象

 

1.3 局部内部类

定义在外部类的方法体或者 {}中,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法格式
public class OutClass {
            int a = 10;
            public void method(){
                int b = 10;
// 局部内部类:定义在方法体内部
// 不能被public、static等访问限定符修饰
                class InnerClass{
                    public void methodInnerClass(){
                        System.out.println(a);
                        System.out.println(b);
                    }
                }
// 只能在该方法体内部使用,其他位置都不能用
                InnerClass innerClass = new InnerClass();
                innerClass.methodInnerClass();
            }
            public static void main(String[] args) {
// OutClass.InnerClass innerClass = null; 编译失败
            }
        }
注意事项 】 1. 局部内部类只能在所定义的方法体内部使用 2. 不能被 public 、 static 等修饰符修饰 3. 编译器也有自己独立的字节码文件,命名格式:外部类名字 $ 数字内部类名字 .class 4. 几乎不会使用

1.4 匿名内部类

 

interface A{
    void testA();
}
public class Test{
    public static void main(String[] args) {
  //以下代码可以认为有个类实现了A接口,并重写了A中的方法
   1.     new A(){
            public void testA(){
                
            };
        }.testA();

   2.    A a = new A(){
           public void testA(){

            };
       }
       a.testA();


    }
}

//一个类一个字节码文件

外部类名$内部类名

外部类名$数字         //匿名内部类

在匿名内部类中,能够访问的是,没有被修改过的数据--变量的捕获

能访问的是建议被final修饰的

标签:部类,Java,内部,--,OutClass,实例,static,public
From: https://blog.csdn.net/2301_80055001/article/details/143465455

相关文章

  • 使用Typora添加行内数学公式怎么添加?
    首先需要确认,Typora已经勾选“插入内联公式”选项。具体方法:点击“文件”-->“偏好设置”-->“Markdown”-->“Markdown扩展语法”—>勾选“内联公式(例:$\LaTeX $)”确认以上步骤之后,就可以使用了 单个$:用于表示行内数学公式。例如,$E=mc^2$会被渲染为E=m......
  • Java并发编程
    目录Java并发编程原子性可见性有序性导致并发程序的根本原因是什么原子性和锁区别,加锁是为了什么为什么要加锁锁问题死锁(DeadLock)无锁有锁Synchronized对象在内存中的实现偏向锁/轻量级锁/重量级锁锁升级如何实现可重入性不可中断性同步方法同步代码缺......
  • luoguP1005 矩阵取数游戏
    有n*m的矩阵,每个元素a[i][j]均为非负整数,游戏规则如下:每轮从每行各取一个元素,共n个。经过m轮后取完所有元素。每次取走的元素只能是该元素所在行的行首或行尾。每轮取数都有一个分值,为每行取数的得分之和,每行取数的得分为被取走的元素值乘以2的i次方,其中i为取数轮次,从1开始。......
  • How to Install psql on Mac
    参考链接:Here#firststep➜brewinstalllibpq==>Downloadinghttps://mirrors.ustc.edu.cn/homebrew-bottles/api/formula.jws.json==>Downloadinghttps://mirrors.ustc.edu.cn/homebrew-bottles/api/cask.jws.json==>Fetchingdependencie......
  • luoguP1352 没有上司的舞会
    给定一棵有N个节点的树,节点i的权值为r[i],需要选出一些不相邻的节点,使得权值之和最大,求最大值。1<=N<=6E3;-128<=r[i]<=127分析:自下而上dp,对于每个节点,可以选或者不选。如果选,那么其子节点不能选;如果不选,那么其子节点可以选或不选。#include<bits/stdc++.h>usingi64=long......
  • 各种缺省源 / 实用程序
    好看的拍子点击查看代码#include<windows.h>#include<stdio.h>#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<ctime>#defineintlonglong#definerep(i,a,......
  • 【笔记/模板】Johnson全源最短路
    模板题目www.luogu.com.cn//Problem:P5905【模板】全源最短路(Johnson)//Contest:Luogu//URL:https://www.luogu.com.cn/problem/P5905//MemoryLimit:128MB//TimeLimit:1000ms////PoweredbyCPEditor(https://cpeditor.org)#include<bits/stdc++.h>......
  • HTML4
    开发者文档:W3C官网:www.w3c.orgW3School:www.w3school.com.cnMDN:developer.mozilla.org1、HTML标签属性HTML标签属性用于给标签提供附加信息,可以写在起始标签或单标签中。有些特殊的属性,没有属性名,只有属性值,如<inputdisabled>。注意:不同的标签,有不同的属性,也有一些通用......
  • 【笔记/模板】KMP 与 Z 函数
    前缀函数前缀函数通常称为border,一个字符串\(S\)的border定义为它的一个前缀子串\(t(t\neS)\),满足\(t\)既是\(S\)的前缀,也是\(S\)的后缀。下文的border均为\(S\)的最长border长度。简单来说,对于一个字符串\(S=\texttt{abcabcd}\)(下标从\(1\)开始),它的前......
  • AC堆叠配置
    AC堆叠(VAC)配置两台AC设备,使用虚拟化方案组合成1台虚拟AC。AC1和AC2之间的G0/3-4端口作为虚拟交换链路。配置AC1为主,AC2为备。主设备description为AC1,备用设备description为AC2。AC1virtual-acdomain100device1device1priority200device1descriptionAC-1......