JavaSE基础内部类
内部类
嵌套在外部类中的类
内部类的分类:
1 成员内部类
特征:定义在外部类里面,跟成员变量平级
场景:房子有窗户(此时窗户只属于房子)
package com.ch.inner;
public class House {
/**
* 房子有窗户
* 缺点:Window可以服务于多个类型(房子、门、车)
*/
//private Window w1 = new Window();
private class Window{
public Window() {
System.out.println("窗户创建了....");
}
public void openWindow() {
System.out.println("打开窗户");
}
}
/**
* 房子有入住的行为
*/
public void load() {
System.out.println("拎包入住");
//创建内部类的对象,打开窗户
Window w1 = new Window();
w1.openWindow();
}
public static void main(String[] args) {
House house = new House();
house.load();
}
}
小结:成员内部类可以使用 private friendly protected public修饰
名义上Window是内部类,实际上Window是外部类,因为每个内部类都有自己独立的class文件,内部类命名规范:外部类 内 部 类 . c l a s s , 例 如 : H o u s e 内部类.class,例如:House 内部类.class,例如:HouseWindow.class
工作中一旦看到类名称有$,它一定是一个内部类
class House$Window
{
public House$Window(House paramHouse)
{
System.out.println("窗户创建了....");
}
public void openWindow() {
System.out.println("打开窗户");
}
}
场景:判断闰年,输入一个年份判断是否是闰年
例如:闰年判断是一个企业最核心的业务逻辑,为了安全,将闰年的判断定义为内部类,不能让外界去访问
工作中:往往将最核心的业务逻辑使用内部类定义,让外界(除了外部内以外)无法访问内部类的逻辑。
package com.ch.inner;
/**
* 外部类:判断闰年
*/
public class LeapYear {
private int years;
public LeapYear(int years) {
this.years= years;
}
/**
* 判断闰年的行为
* @return true是闰年 false不是闰年
*/
public boolean judge() {
//创建成员内部类的对象
InnerLeapYear year = new InnerLeapYear();
//调用成员内部类的行为判断闰年
return year.judgeLeapYear();
}
/**
* @author caojie
* 判断闰年的内部类
*/
private class InnerLeapYear{
/**
* 内部类的判断行为(业务逻辑)
* @return
*/
public boolean judgeLeapYear() {
return years%4==0&&years%100!=0||years%400==0;
}
}
}
测试类:
package com.ch.inner;
import java.util.Scanner;
/**
* 测试内部类
*/
public class TestLeapYear {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入年份");
int year =input.nextInt();
LeapYear yy =new LeapYear(year);
boolean rs = yy.judge();
if(rs) {
System.out.println(year+"是闰年");
}else {
System.out.println(year+"不是闰年");
}
}
}
2局部内部类(了解)
概念:定义在方法里面的内部类,跟局部变量是平级的
特征:封装性比成员内部类更高,只能在外部类的某一个方法中使用
由于跟局部变量平级,所以不能使用public、protected、private修饰局部内部类
3静态内部类
static和面向对象互斥的,所以有static的地方就不能有this
一个类的class文件,加载到JVM,JVM检查有没有static修饰的属性、块、方法没有被初始化,如果有就会初始化static,为其分配空间。
一旦你使用new关键字创建类的对象,在创建之前所有的static都会初始化完毕
使用static关键字修饰的内部类叫做静态内部类
为什么需要学习静态内部类,和成员内部类有啥区别?
静态内部类不会持有外部类的引用(外部类的this)
静态内部类使用
1 强关联的时候使用静态内部类(人有家)
2 内部类不需要访问外部类的成员使用静态内部类,意味着内部类不会过多的跟外部类交互
单实例
一个项目、一个软件、一个程序从开始运行一直到结束,始终只有一个实例,叫做单实例
单实例特征:
某个对象的实例只会new一次
自己new自己
构造方法私有化,让外界无法new
小结:工作中如果你想让某个对象从始至终只有一份实例(一个对象),使用构造方法化自己创建自己,从而产生唯一的实例(对象)
4匿名内部类
没有名字的内部类
特征:定义在外部类里面
由外部类创建内部类的对象,调用内部类的方法
什么情况下使用匿名内部类?
如果某个类型只使用一次,用匿名内部类
面向接口编程,也可以使用匿名内部类
好处:节约磁盘空间,节约内存空间
隐式创建匿名内部类,完成接口的回调
5Lambda表达式
SinceJDK1.8
函数式编程,也叫作过程式编程,起源于汇编语言
Lambda由三部分组成:
1 参数列表 (参数1,参数2)
2 跳转运算符 -> 跳转运算符相当于java语言的goto
3 函数体 { }
Lambda的出现为了解决匿名内部类复杂的结构