JAVA 内部类 inner class

2023-10-31

内部类:
在一个类的内部定义的类称为内部类。
类的内部:
第一:与属性或方法 同级
内部类
这个类与外部类的每个对象是一对一的关系。Person与Birthday
静态内部类
这个类与外部类是1对1的关系。每个对象共享这个内部类对象。Hero和Crystal
第二:在方法内部
本地内部类
在方法中定义的类(局部类,出了方法就没了)
匿名内部类
没名字,与抽象类和接口配合使用。创建内部类的同时创建对象。

使用频次:
匿名类:非常频繁
静态内部类:单例,系统的部分类(Map.Entry<K,V>)
内部类:Birthday和Person
本地内部类:几乎不用

//一个文件(xx.java)里面可以定义若干个类。
//定义类的语法格式:
// class 类名{属性和方法}
//每个类定义完以后,都能正常的使用。
//和你在每一个单独定义一个类差不多。

//如果一个文件里定义了多个类。那么这个文件中只能有一个public修饰的类.
//因为编译器会做检查,public修饰的类必须与文件名相同。
//因为文件名只有一个,所以你只能把其中一个类声明为public

//没有用public修饰的类与public修饰的类到底什么区别呢?
//唯一的区别就是类的作用范围不同,public修饰的类,可以跨包使用
//没有public修饰的类,不能跨包使用,只能在本包中使用。


//什么是内部类呢?
//在一个类的内部定义的类 称为内部类。

//什么情况下需要使用内部类呢?
//如果 一个类(Birthday)是为了另外一个类(Person)而存在的,
//那么这个类(Birthday)可以定义为另外一个类(Person)的内部类.

//怎么使用内部类?
//内部类如何创建对象
//外部类.内部类 对象名 = 外部类对象.new 内部类(参数)
//内部类如何使用呢?—访问属性,访问方法
//正常访问 对象名.属性 对象名.方法

//我们见过哪个系统内部类呢?
//Map.Entry<K,V>

class MyClass{
class InnerClass1{
    public InnerClass1() {
        System.out.println("InnerClass1 created..");
    }
}
class InnerClass2{
    public InnerClass2() {
        System.out.println("InnerClass2 created..");
    }
}
void getInnerClass() {
    new InnerClass1();
    new InnerClass2();
}
public static void main(String[] args) {
    new MyClass().getInnerClass();
}
}

//输出:
InnerClass1 created…

InnerClass2 created…


//在一个类的 方法内部 定义的类,称为本地(局部)内部类。

public class LocalClass {

public static void main(String[] args) {

	class A{
		int a;
		int b;
		
		public int getA() {
			return a;
		}

		public void setA(int a) {
			this.a = a;
		}

		public int getB() {
			return b;
		}

		public void setB(int b) {
			this.b = b;
		}

		public void test() {
			System.out.println("本地类的方法");
		}
	}
	
	A a = new A();
	a.setA(100);
	System.out.println(a.getA());
	a.test();
	
}
}

//匿名内部类,它是一个没有名字的本地内部类。
//为什么时候匿名内部类是本地内部类?
//因为匿名内部类是出现在方法里的。

//因为匿名内部类没有名字,因此匿名内部类不能像其他类一样
//正常的创建对象。
//因此 我们创建匿名内部类的同时把对象创建出来。
//抽象类 对象 = new 抽象类(参数){
// 实现抽象类中的抽象方法(有几个实现几个)
//};
//
//接口名 对象 = new 接口名(){
// 实现接口中的全部方法
//};

//与匿名内部类配套使用的是 抽象和接口。

public class NoNameClass {

public static void main(String[] args) {

	
	A a1 = new B();
	a1.test();
	
	int x = 100;
	
	A a2 = new A() {
		@Override
		public void test() {
			int y = x + 20;
			System.out.println("haha"+x);
			aaa();
		}
		
		public void aaa() {
			System.out.println("hello world");
		}
		
	};
	a2.test();
	A a3 = new A() {
		@Override
		public void test() {
			System.out.println("这是匿名类的使用");
		}
	};
	a3.test();
	
	
	MyInterface c = new C();
	c.test();
	
	MyInterface c2 = new MyInterface() {
		@Override
		public void test() {
			System.out.println("我是接口的匿名实现类");
		}
	};
	c2.test();
}
}

//什么是静态内部类,在一个类内部定义的用static修饰的类叫静态内部类
//静态内部类与内部类的区别是什么?
//内部类是属于每个对象的,每个对象都有一个。
//静态内部类是属于类的,大家共享一个。
//如何创建静态内部类的对象呢?
//外部类.静态内部类 对象名 = new 外部类.静态内部类(参数)
//如何访问静态内部类呢?----访问属性,访问方法
//正常访问 对象名.属性 对象名.方法

//什么时候用过静态内部类呢?
//----单例的第三种写法

public class Test2 {

public static void main(String[] args) throws Exception {
	Hero h1 = new Hero("提莫",1000,200);
	Hero h2 = new Hero("盖伦",1500,180);

	
	
	Hero.Crystal crystal = new Hero.Crystal();
	crystal.test();
	
	Class c = crystal.getClass();
	Field hp = c.getDeclaredField("hp");
	hp.setAccessible(true);
	hp.set(crystal, 10000);
	System.out.println(crystal);

}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA 内部类 inner class 的相关文章

随机推荐

  • 使用Python进行基于属性的测试

    When you write unit tests it s hard to find the right test cases You want to be certain that you covered all the interes
  • Acm Club 1326:算法2-8~2-11:链表的基本操作

    题目描述 链表是数据结构中一种最基本的数据结构 它是用链式存储结构实现的线性表 它较顺序表而言在插入和删除时不必移动其后的元素 现在给你一些整数 然后会频繁地插入和删除其中的某些元素 会在其中某些时候让你查找某个元素或者输出当前链表中所有的
  • 基于JT/T808协议、JT/T809协议、JT/T1078协议、苏标主动安全的车联网平台架构方案

    JT808是定位协议 通讯协议 基础协议 其他协议基于该协议进行扩展 JT809是转发协议 监管协议 第三方平台通过809向808进行数据获取与事件下发 JT1078是多媒体监控协议 视频 音频 对讲可以通过809扩展实现上级也可以多媒体监
  • Android 关于微信原生登录和友盟第三方微信登录来获取code那些坑(40029问题)

    如果你恰好集成了微信原生登录与友盟三方登录 那么可以继续往下看了 问题描述 本来在APP端使用openid就可以了的 结果未想到 后台要我们传一个Code过去 就是微信里面的Resp Error code这个 code 友盟登录里是直接获取
  • java 线程:概念与原理

    本文转载至 http lavasoft blog 51cto com 62575 99150 一 操作系统中线程和进程的概念 现在的操作系统是多任务操作系统 多线程是实现多任务的一种方式 进程是指一个内存中运行的应用程序 每个进程都有自己独
  • qt鼠标事件

    一 qt的鼠标事件包含头文件
  • 小程序 image标签 默认宽高问题,如何实现高度自适应

    微信小程序的图片image有默认的宽高 width 320px和height 240px 我遇到的业务场景是宽度100 高度自适应 所以 1 宽度设置成100 img width 100 2 设置mode属性 mode widthFix
  • 2019夏令营之行(下) 南大软件+北邮网研院

    夏令营 上 https blog csdn net Cc Sonia article details 95238001 正如上篇博客所说 北航计算机是我最满意的结果 所以剩下的这两个夏令营我就没认真参加2333 7 17 7 20 南大软件
  • 基于多进程并发-进程通讯之管道(pipe)

    一 管道 pipe 所谓的管道 就是内核 的 串缓存 Pipe 一个进程从管道的 端写 的数据 实际上是缓存在内核中的 另 端读取 也就是从内核中读取这段数据 特性 有两种类型的管道 匿名管道 有名管道 也叫命名管道 简单实现 有大小限制
  • 【PTA】【数据结构与算法题目集】7-29 修理牧场(25分)【霖行】

    PTA 数据结构与算法题目集 7 29 修理牧场 25分 霖行 题目 题目链接 7 29 修理牧场 25 分 农夫要修理牧场的一段栅栏 他测量了栅栏 发现需要N块木头 每块木头长度为整数L i个长度单位 于是他购买了一条很长的 能锯成N块的
  • win/linux集群源码,Linux win/linux集群源码 - 下载 - 搜珍网

    linux linux Bin linux Bin Control exe linux Bin Control zip linux Bin dat linux Bin dat WinDDOS dat linux Claer bat linu
  • [机缘参悟-76]:沟通技巧-职场中常见不合适语言的案例分析(尽量避免使用反问式语言)

    目录 第一部分 针对他人的用词 避免使用 怎么 这样的责难的词 避免使用 老实说 这样过虚假的词 避免说 xxx几点左右 这种的不确定性词 避免使用 是xxx人的错 这种强烈的否定性的词 避免使用 但是 这一种强烈的转折性的词 避免使用 务
  • 判断一个数是否偶数(深度思考)

    当看到这个题 很明显就能想到 if unm 2 0 return true else return false 那么如果继续优化 我们都知道 计算机都是2进制计算 那么我们可以从二进制入手 2 gt 0010 4 gt 0100 3 gt
  • 【SpringMVC】SpringMVC :@RequestMapping注解

    文章目录 1 美图 2 概述 3 使用 4 源码 4 0 RequestMapping 4 1 AbstractHandlerMethodMapping 1 美图 2 概述 如 果 Web 工程使用 了 Spring MVC 那么它在启动阶
  • Vue连接数据库实现登录注册

    在前端开发中 经常需要将用户的注册和登录信息存储到数据库中 然后再进行登录验证 本文将介绍如何使用Vue连接数据库实现登录注册功能 前提条件 在开始之前 需要安装并配置好以下环境 Vue js Node js MongoDB 安装依赖 安装
  • kl散度学习笔记python实现

    KL Divergence KL Kullback Leibler Divergence中文译作KL散度 从信息论角度来讲 这个指标就是信息增益 Information Gain 或相对熵 Relative Entropy 用于衡量一个分布
  • windows下如何恢复notepad未保存的文件

    notepad恢复未保存的文件 备份文件 C Users 你当前用户的用户名 AppData Roaming Notepad backup可以恢复 如果找不到此文件 因为文件被隐藏了 打开隐藏文件即可
  • tomcat 和 apache跟CGI都有什么关系呢?

    tomcat 和 apache跟CGI都有什么关系呢 IIS和古老的PWS都是win下运行的 web服务程序 对吧 这下边跑的是 asp对吧 这些不会跨平台对吧 web服务程序 是 apache还是tomcat 呢 jsp跟 asp是一种功
  • 简搭(jabdp)快速入门(一)

    一 文件夹说明 本应用包为绿色免安装版本 只需要将本jabdp文件夹复制至系统英文名称目录下即可 mysql目录为默认集成的数据库目录 webapps目录为应用程序所在目录 其中设计器包含ae与iDesigner工程 项目平台包含iPlat
  • JAVA 内部类 inner class

    内部类 在一个类的内部定义的类称为内部类 类的内部 第一 与属性或方法 同级 内部类 这个类与外部类的每个对象是一对一的关系 Person与Birthday 静态内部类 这个类与外部类是1对1的关系 每个对象共享这个内部类对象 Hero和C