JavaSE基础之内部类

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的出现为了解决匿名内部类复杂的结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值