首页 > 其他分享 >16-内部类

16-内部类

时间:2022-11-27 11:24:28浏览次数:25  
标签:部类 内部 16 void class new public

typora-root-url: images

一、内部类

1.1、什么是内部类

​ 将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。

1.2、什么时候使用内部类

​ 在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。

class 汽车 { //外部类
	class 发动机 { //内部类
	}
}

1.3、内部类的分类

​ 内部类分为成员内部类与局部内部类。

​ 我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符、继承与实现关系等。在内部类中可以直接访问外部类的所有成员。

1.4、成员内部类

1.4.1、说明

​ 成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问。

1.4.2、格式

class 外部类 { 
	修饰符 class 内部类 {
		//其他代码
	}
}

​ 访问方式:

外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

1.4.3、代码实现

​ 定义内部类:

class Body {//外部类,身体
	
    private boolean life= true; //生命状态
    
    public class Heart { //内部类,心脏
		public void jump() {
         	System.out.println("心脏噗通噗通的跳")
			System.out.println("生命状态" + life); //访问外部类成员变量
		}
	}
}

​ 访问内部类:

public static void main(String[] args) {
	//创建内部类对象
	Body.Heart bh = new Body().new Heart();
	//调用内部类中的方法
	bh.jump();
}

1.5、局部内部类

1.5.1、说明

​ 局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问。

1.5.2、格式

class 外部类 { 
	修饰符 返回值类型 方法名(参数) {
		class 内部类 {
			//其他代码
		}
	}
}

​ 访问方式:

在外部类方法中,创建内部类对象,进行访问

1.5.3、代码实现

​ 定义类:

class Party {//外部类,聚会
	public void puffBall(){// 吹气球方法
		class Ball {// 内部类,气球
              public void puff(){
     			System.out.println("气球膨胀了");
			  }
		}
		//创建内部类对象,调用puff方法
		new Ball().puff();
	}
}

​ 访问内部类:

public static void main(String[] args) {
	//创建外部类对象
	Party p = new Party();
	//调用外部类中的puffBall方法
	p.puffBall();
}

1.6、匿名内部类

1.6.1、概念

​ 内部类是为了应对更为复杂的类间关系。查看源代码中会涉及到,而在日常业务中很难遇到,这里不做赘述。

​ 最常用到的内部类就是匿名内部类,它是局部内部类的一种。

​ 定义的匿名内部类有两个含义:

  • 临时定义某一指定类型的子类
  • 定义后即刻创建刚刚定义的这个子类的对象

1.6.2、作用

​ 匿名内部类是创建某个类型子类对象的快捷方式。

1.6.3、格式

new 父类或接口(){
	//进行方法重写
};

1.6.4、代码实现

//已经存在的父类:
public abstract class Person{
	public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Person p = new Person(){
	public void eat() {
		System.out.println(“我吃了”);
	}
};
//调用eat方法
p.eat();

​ 使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成。虽然是两个步骤,但是两个步骤是连在一起完成的。

​ 匿名内部类如果不定义变量引用,则也是匿名对象。代码如下:

new Person(){
	public void eat() {
		System.out.println(“我吃了”);
}
}.eat();

1.7、静态内部类

1.7.1、概念

​ 静态内部类和成员内部类相比多了一个static修饰符。它与类的静态成员变量一般,是不依赖于外部类的。同时静态内部类也有它的特殊性。因为外部类加载时只会加载静态域,所以静态内部类不能使用外部类的非静态变量与方法。

​ 同时可以知道成员内部类里面是不能含静态属性或方法的。

1.7.2、代码实现

public class InnerTest {
    private static String name;
    private int age;
    public InnerTest(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void getInstance() {
        System.out.println("name:" + name.toString() + ",age:" + age);
    }
    public static class A {
        private String sex;
        public A(String sex) {
            this.sex = sex;
        }

        public void getInstance() {
            System.out.println(sex.toString() + name.toString());
        }
    }
    public static void main(String[] args){
        InnerTest innerTest = new InnerTest("张三",25);
        innerTest.getInstance();
        InnerTest.A ia = new A("男");//静态内部类的实例化对象格式
        ia.getInstance();
    }
}

标签:部类,内部,16,void,class,new,public
From: https://www.cnblogs.com/rito-blog/p/16929273.html

相关文章

  • pwn | pwn2_sctf_2016
    pwn|pwn2_sctf_201632位ret2libc+整数溢出题目给了syscall但是找不到popeax,没办法使。exp如下:frompwnimport*fromLibcSearcher.LibcSearcherimport*impo......
  • 剑指offer——Day16 排序(简单)
    Day162022.11.22排序(简单)45.把数组排成最小的数自己实现没有思路题解也是比较大小,只是这个比较大小的方法是两个数字字符串stringx和stringy,如果x+y<y+x,说明x应该......
  • 下载blob内部的m3u8格式视频出现问题,没有出现表格里的文件
      在network的filter,输入m3u8,不显然fetch,表格也没有m3u8文件的路径,无法找到原始的视频链接文件。不晓得什么原因。 ......
  • 【LeeCode】169. 多数元素
    【题目描述】​​https://leetcode.cn/problems/majority-element/description/?favorite=2cktkvj​​给定一个大小为 ​​n​​ 的数组 ​​nums​​ ,返回其中的多数元......
  • 博迪投资学·资本市场:第9、14、16章的模型总结
    第九章:资本资产定价模型资本资产定价模型(CPM)是现代金融经济学的莫基石。该模型对资产风险与其期望收益之间的关系给出了精准的预测。资本资产定价模型的一个关键观点是......
  • 使用vscode插件查看文件的16进制
    有时候想看看文件的16进制,又不想编写代码来处理,那么这时候可以使用vscode和插件HexEditor一键查看文件的16进制然后就可以查看文件的16进制了......
  • 【解题报告】CF DIV2 #ROUND 716 A~C
    【解题报告】CFDIV2#ROUND716A~C​​比赛链接​​​数学场/规律场A题5分钟速切,B题开始没看懂先看了C,发现C整不来,B整了半天打表找规律一发AC。D貌似要分块莫队之类的还......
  • CF1637H Minimize Inversions Number
    MinimizeInversionsNumber首先考虑\(k=1\),记\(g_i=\sum_{j=1}^{i-1}[p_i<p_j]-\sum_{j=1}^{i-1}[p_i>p_j]\),那么\(g_i\)表示将\(i\)移向最前面逆序......
  • [dp 记录]P3349 [ZJOI2016]小星星
    绝世容斥好题,刚好NOIp前要复习容斥,就拉过来当100紫了。祝自己明天的NOIprp++这题好久前看过题解,感觉好可惜,浪费了好题。以后自己不会的题也不能看题解了。题意:......
  • C#.NET ASP.NET IIS 加载.pfx私钥证书时报错“出现了内部错误。”
    C#.NETASP.NETIIS加载.pfx私钥证书时报错“出现了内部错误。” 原始代码报错:X509Certificate2x509cer=newX509Certificate2(rawData,m.cert_pwd); 解决方......