2020-09-20

Java 内部类

内部类分类:

  1. 成员内部类
  2. 局部内部类
  3. 匿名内部类(实质是局部内部类的一种

成员内部类

  • 在一个类中定义另一个类,即为成员内部类
  • 内部类可以随意访问外部类成员,但外部类必须借助内部类才能访问内部类成员
  • 成员内部类的访问方式:
  1. 间接访问:通过在外部类方法中使用内部类,然后在mian方法中通过调用此方法实现对内部类的调用
  2. 直接访问:外部类.内部类  对象名 = new 外部类().new 内部类();

访问方法如下:

package te;

public class Outter {
	public void function() {
		Inner inner = new Inner();
		System.out.println("通过调用外部类方法实现对内部类的调用");
		inner.method();
	}
	public class Inner{
		public void method() {
			System.out.println("调用内部类的方法");
		}
	}
}



package te;

public class Test {
	public static void main(String[] args) {
		Outter outter = new Outter();
		//通过外部类方法对内部类进行调用
		outter.function();
		//直接调用
		Outter.Inner i = new Outter().new Inner();
		i.method();
	}
}

局部内部类

  • 在外部类成员方法中定义的类为局部内部类
  • 局部内部类只有当前方法可以使用
  • 若局部内部类想要访问外部类的成员变量,这个变量必须是有效final的,即不能改变
  • 局部内部类的访问方式:
  1. 在局部内部类所在的方法中new一个内部类对象,使用这个内部类对象调用内部类成员
  2. 通过调用局部内部类所在的成员方法实现对局部内部类的调用
//外部类与局部内部类
public class Outter {
	private int a = 10;
//	a = 20;		若局部内部类想要访问外部类的成员变量,这个变量必须是有效final的,即不能改变
	//定义为private final int a = 10就更为保险
	public void out() {
		class Inner{		//注意:局部内部类不能有public等修饰符
			private int a = 20;
			public void method() {
				int a = 30;
				System.out.println(a);	//输出内部类method方法中局部变量a=30
				System.out.println(this.a);	//输出内部类的成员变量a=20
				System.out.println(Outter.this.a);	//输出外部类成员变量a=10
			}
		}
		Inner inner = new Inner();
		inner.method();
	}
}
//定义测试类:
public class Test {
	public static void main(String[] args) {
		Outter outter = new Outter();
		outter.out();
	}
}

运行结果如下:

匿名内部类

  • 匿名内部类的使用场景:接口的实现类只需使用唯一的一次,则可省略掉接口实现类的定义,转而使用匿名内部类
  • 匿名内部类使用方法:接口名称 对象名称 = new 接口名称(){//实现所有抽象方法};

使用接口实现类与使用匿名内部类的比较:

//定义一个接口,里面包含一个抽象方法method()
public interface OutterInterface {
	public void method();
}
//定义一个接口实现类,实现接口的抽象方法method
public class ImplOutterInterface implements OutterInterface {
	public void method() {
		System.out.println("使用实现类实现接口的method方法");
	}
}
//定义一个测试类,在这个测试类里比较匿名内部类与接口实现类
public class Test {
	public static void main(String[] args) {
		ImplOutterInterface obj = new ImplOutterInterface();
		obj.method();
		OutterInterface out = new OutterInterface() {
			public void method() {
				System.out.println("使用匿名内部类实现接口的method方法");
			}
		};
		out.method();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是代码实现: ```python import datetime def format_time_diff(start_time, end_time): time_diff = end_time - start_time if time_diff.days > 365: return end_time.strftime("%Y年%m月") elif time_diff.days > 30: return end_time.strftime("%Y年%m月%d日") elif time_diff.days > 0: return f"{time_diff.days}天前" elif time_diff.seconds > 3600: return f"{int(time_diff.seconds/3600)}小时前" elif time_diff.seconds > 60: return f"{int(time_diff.seconds/60)}分钟前" elif time_diff.seconds > 0: return f"{time_diff.seconds}秒前" else: return "未来时间" start_time = datetime.datetime(2018, 3, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 1, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 8, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 20) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 50) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 30, 40) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") ``` 输出结果为: ``` 2018-03-01 09:00:00 -> 2020-02-29 09:30:30: 2018年03月 2020-01-01 09:00:00 -> 2020-02-29 09:30:30: 2020年01月01日 2020-02-01 09:00:00 -> 2020-02-29 09:30:30: 28天前 2020-02-29 08:00:00 -> 2020-02-29 09:30:30: 1小时前 2020-02-29 09:29:20 -> 2020-02-29 09:30:30: 1分钟前 2020-02-29 09:29:50 -> 2020-02-29 09:30:30: 40秒前 2020-02-29 09:30:40 -> 2020-02-29 09:30:30: 未来时间 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值