IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java】内部类 -> 正文阅读

[Java知识库]【Java】内部类

内部类


  • 内部类的分类:
    ① 定义在外部类局部位置上(一般在方法中)
    1)局部内部类(有类名)
    2)匿名内部类(无类名)
    ② 定义在外部类的成员位置上
    1)成员内部类(无static修饰)
    2) 静态内部类(用static修饰)

局部内部类


基础认识

  • 位置
class A {  
    //外部类A  
    void func() {  
        //局部内部类C  
        class C {  
        }  
    }  
}  
//其他类C  
class B{}
  • 本质class
    局部内部类和普通类一样可以有属性、方法、构造器、代码块、内部类
	class Outer {  
	//外部类  
	void func01() {  
		//局部内部类  
		class Inner {  
			int a;//属性  
			void func02(){}//方法  
			Inner(){}//构造器  
			{}//代码块  
		}  
	}  
}
  • 地位:局部变量
    1)不能添加访问修饰符,但是可以用final
    2)作用域:只在定义它的方法/代码块中

局部内部类的访问

  1. 局部内部类 直接访问 外部类的所有成员
  2. 外部类访问局部内部类 需创建对象再访问
  3. 外部其他类 不能访问 局部内部类
class Outer {  
    //外部类  
    int n=1;  
    void func01() {  
        //局部内部类  
        class Inner {  
            void func02(){  
                System.out.println("Inner直接访问Outer中的n:"+n);  
            }  
        }  
        Inner inner = new Inner();  
        inner.func02();  
    }  
  
}

重名问题:由于局部内部类可以直接访问到自己类和外部类的所有成员,当外部类成员与自己类成员重名时,会遵循就近原则,若局部内部类想访问外部类成员时用外部类名.this.成员

class Outer {  
	//外部类  
	int a=1;  
	void func01() {  
		//局部内部类  
		class Inner {  
			int a;  
			void func02(){  
				System.out.println("局部内部类"+a+" 外部类"+Outer.this.a);  
			}  
		}  
		Inner inner = new Inner();  
		inner.func02();  
	}
}

【补充以上原理】Outer.this其实就是外部类的对象,即哪个对象调用了func01()Outer.this就是哪个

	class Outer {  
	    //外部类  
	    int a=1;  
	    void func01() {  
	        //局部内部类  
	        class Inner {  
	            int a;  
	            void func02(){  
	                System.out.println("局部内部类中的a:"+a+" 外部类中的a:"+Outer.this.a);  
	                System.out.println(Outer.this);  
	            }  
	        }  
	        Inner inner = new Inner();  
	        inner.func02();  
	    }  
	  
	}  
	//其他类  
	class A{}  
	public class InnerClass {  
	    public static void main(String[] args) {  
	        Outer outer = new Outer();  
	        outer.func01();  
	        System.out.println(outer);  
	    }  
	}

匿名内部类


语法

new 类或接口(参数列表){
};

本质:无名字的class类 + 对象

若B类的方法func01()想调用接口IA的func02(),则需要在写一个C类实现IA的func02(),然后在B类方法func01()中创建一个对象ia,调用func02(),但ia只使用了一次这样浪费空间,那么如何合理调用func02()?这时匿名内部类解决上述问题,简化开发
在这里插入图片描述

解决方式如下:

interface IA{  
    void func02();  
}  

class B{  
    void func01(){  
        IA C=new IA(){  
            @Override  
            public void func02() {  
                System.out.println("this is C");  
            }  
        };  
        C.func02();  
        System.out.println(C.getClass());  
    }  
}
  1. C的编译类型为:IA
  2. C的运行类型为:匿名内部类——>B$1
  3. 匿名内部类只能使用一次
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:36:51  更:2022-04-14 23:37:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:34:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码