当前位置:网站首页>内部类的相关知识
内部类的相关知识
2022-07-27 05:21:00 【只羡鸳鸯不羡仙仙】
目录
一、内部类的概念
1、内部类的引出
在现实生活中,汽车和汽车发动机,发动机也有很多的属性和方法,那么发动机对于汽车来说就是一个内部类 。另外就是心脏和人体的关系,心脏有很多属性和方法,,那么心脏对于人体来说就是一个内部类。
2、内部类的解释
所谓的内部类就是将一个类嵌套到另外一个类内部的操作,其实内部类也体现到了封装的思想,内部类同样也有保护性和易用性。
二、内部类的分类
1、成员内部类
在外部类的内部不使用ststic关键字定义的类,成员内部类需要依赖外部类对象,先有外部类对象,然后才有内部类对象。
public class Outter {
private String outtermsg="Outer中的的msg属性";
private static int age=0;
public void fun(){
System.out.println("Outter的fun方法");
//访问普通类的属性
System.out.println(outtermsg);
//访问内部类需要通过对象访问
inner inner=new inner();
inner.fun();
System.out.println(inner.innermsg);
}
//-----------------------------------------------
//成员内部类
class inner {
private String innermsg="Inner中的msg属性";
public void fun(){
System.out.println("inner的fun方法");
//访问内部类的innermsg属性
System.out.println(innermsg);
//也可以访问外部类的所有属性
System.out.println(outtermsg);
}
}
//-------------------------------------------------
public static void main(String[] args) {
Outter outter=new Outter();
outter.fun();
}
}
对于成员内部类来说,内部类可以访问本类以及外部类的所有属性,同时外部类也可以通过内部类对象去访问内部类的属性。
①内部类和外部类可以彼此访问
②内部类可以对外部类的外部完全隐藏(就相当于把内部类看做外部类的属性看待),内部类可以使用private权限修饰符
③内部类可以变相的实现多继承(了解即可,不推荐使用)
class A{} class B{} class C{ class innerA extends A{} class innerB extends B{} }关于成员内部类产生对象的两种方式:
①在外部类的内部产生成员内部类对象,内部类名称 内部类引用=new 内部类();
②若内部类对外部可见(没有用private修饰),在外部类的外部创建内部对象
外部类名称.内部类名称 内部类引用=new 外部类().new 内部类();
关于成员内部类的静态属性问题
①成员内部类可以访问外部类的静态属性
② 成员内部类不可以自定义静态属性
2、静态内部类
使用static关键字定义在另一个类的内部类,和成员内部类最大的区别是,静态内部类不需要外部类的对象,和外部类是一个相对独立的关系,只是套在外部类的内部定义而已
静态内部类不能直接访问外部类的静态属性 ,需要通过外部类对象来访问
静态内部类可以定义自己的静态属性
3、方法内部类
直接定义在方法中的类,在方法内部类中没有静态属性
①当前类不能使用任何权限修饰符
②对外部完全隐藏(外部类的外部)
③方法内部类要使用fun方法的形参或者局部变量,该变量必须为隐式的final声明


④若方法内部类读取了方法中的局部变量(形参或者局部变量),这个局部变量就无法修改(不仅在内部类中没法改,在方法中也没法修改)

4、匿名内部类
定义在方法中,没有任何的权限修饰符,甚至没有类名称,匿名内部类也是方法内部类的一种,最多用在方法形参中
5、Lambda表达式
2008年JDK8的出现
①引入了Lambda表达式
②在接口中引入了普通方法,JDK8之前的接口只有全局常量和抽象方法

在接口中,default关键字修饰的就是普通方法,不能省略,没有用default的就是抽象方法
③函数式接口:一个接口有且只有一个抽象方法,使用@FunctionalInterface检查当前接口是否是函数式接口

⑤Lambda表达式的前身就是匿名内部类,Lambda表达式把匿名内部类中的多余的new方法定义之类的东西全部省略掉了,只保留了方法体的实现。能使用Lambda表达式的前提是接口必须是函数式接口。

⑥Labbda表达式的四种情况-对应抽象方法的四种分支
无参数无返回值
规则1:若方法体只有一行代码,就可以省略大括号
有参数无返回值
规则2:若方法参数只有一个,就可以省略小括号
规则3:可以省略Lambda表达式中参数的类型若省略类型则都省略类型
有返回值无参数
规则4:若抽象方法存在返回值且覆写的方法体只有一行,此时方法体的大括号,retur都可以省略
有返回值有参数
三、相关代码
https://gitee.com/ren-xiaoxiong/rocket_class_-grammer/tree/master/src/inner_class
https://gitee.com/ren-xiaoxiong/rocket_class_-grammer/tree/master/src/inner_classhttps://gitee.com/ren-xiaoxiong/rocket_class_-grammer/tree/master/src/interface_test
https://gitee.com/ren-xiaoxiong/rocket_class_-grammer/tree/master/src/interface_test
边栏推荐
- Li Kou daily question sword finger offer II 091. paint the house
- 学习软件测试时需要配备的运行环境需求搭建
- 遥感影像识别-成像合成
- Osg环境搭建(Win10+Vs2019)
- Thesis writing (harvest)
- Force deduction problem solving monotonous stack
- Non photorealistic rendering (NPR) paper understanding and reproduction (unity) - stylized highlights for cartoon rendering and animation
- 如何选择正确的服务器备份方法
- Acwing the number of square arrays of one question per day
- The problem that tqdm cannot display in a single line
猜你喜欢
随机推荐
IP核之PLL
Code implementation and introduction of all commonly used sorting
Automated Deployment Project
Multi threaded CAS, synchronized lock principle, JUC and deadlock
Linear progression for face recognition
Dynamic planning for solving problems (4)
通信机制比较
Dynamic planning for solving problems (5)
Unity 实用小技巧(更新ing)
pycharm安装及导入项目注意事项
[headline] Rebirth: the basis of CNN image classification
链表回文判断
【动态规划----钢条切割问题】
遥感影像识别-训练策略
yum获取rpm软件包的三种方法
人月神话阅读笔记
编程学习记录——第7课【函数】
技术和理论知识学习的一点心得
UnityShader-深度纹理(理解以及遇到的问题)
How to distinguish an independent server from a VPS host?
②若内部类对外部可见(没有用private修饰),在外部类的外部创建内部对象


















