day13_Object、内部类

内部类
  • 类体中 还有其他的类,该类就叫内部类

  • 当一个类的内部,需要有一个完整的结构进行描述,而这个内部的完整结构又只为了外部类提供服务,此时该类可以定义为内部类

  • 内部类优点 : 可以访问外部类的所有属性,包括私有化属性

  • 内部类分为:

  • 成员内部类 可以看做成员变量

  • 静态内部类 可以看做静态变量

  • 局部内部类 可以看做局部变量

  • 匿名内部类 可以看做实参

一、成员内部类

成员内部类,没有static修饰

成员内部类中可以 直接 访问外部类的所有属性

在成员内部类中不能有静态声明

public class OuterClass_01 {
	private static String s1 = "私有化静态";
	private String s2 = "私有化成员";
// 成员内部类,没有static修饰
// 可以使用权限控制修饰符的
// 成员内部类中可以 直接 访问外部类的所有属性
// 在成员内部类中不能有静态声明
// 内部类编译之后的类名为 : 外部类类名$内部类类名
protected class InnerClass {
	// static int a = 1;
	// public static void m1(){}
	public void m2(){
		System.out.println(s1);
		System.out.println(s2);
	}
}
public static void main(String[] args) {
	// 外部类对象
	OuterClass_01 outerClass_01 = new OuterClass_01();
	// 通过外部类对象创建内部类对象
	InnerClass innerClass = outerClass_01.new InnerClass();
	innerClass.m2();
}
}

1、InnerClass类定义在 OuterClass_01类的内部,相当于 OuterClass_01类的成员变量的位置,InnerClass类可以使用任意访问修饰符,如:public、private、protected等。

2、InnerClass类中定义的m2()方法可以访问OuterClass_01类中的数据,不受访问控制符的影响。

3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象。而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );

创建InnerClass的内部类对象:

要先创建外部类对象:OuterClass_01 o = new OuterClass_01(); 创建内部类:InnerClass i = o.new InnerClass();访问InnerClass中的test()方法:i.m2();

二、静态内部类

静态内部类,使用static修饰

可以使用权限控制修饰符的

在静态内部类中 成员也能声明 静态也能声明

在静态内部类中,无法直接访问外部类的成员属性,需要有对象

public class OuterClass_02 {
	private static String s1 = "私有化静态";
	private String s2 = "私有化成员";
// 静态内部类,使用static修饰
// 可以使用权限控制修饰符的
// 内部类编译之后的类名为 : 外部类类名$内部类类名
// 在静态内部类中 成员也能声明 静态也能声明
// 在静态内部类中,无法直接访问外部类的成员属性,需要有对象才行
public static class InnerClass {
	public void m1() {
		System.out.println(s1);
		// System.out.println(s2);
		// 创建外部类对象才能调用 外部类的成员属性
		OuterClass_02 o = new OuterClass_02();
		System.out.println(o.s2);
	}

	public static void m2() {
		System.out.println(s1);
		// System.out.println(s2);
		// 创建外部类对象才能调用 外部类的成员属性
		OuterClass_02 o = new OuterClass_02();
		System.out.println(o.s2);
	}
}
public static void main(String[] args) {
	OuterClass_02.InnerClass.m2();
	// 外部类类名可以省略
	InnerClass.m2();
	// 创建对象
	InnerClass innerClass = new OuterClass_02.InnerClass();
	// 外部类类名可以省略
	innerClass = new InnerClass();
	innerClass.m1();
}
}
三、局部内部类
  • 局部内部类 : 方法中的类是局部内部类
  • 局部内部类 不能有静态声明 , 并且该类也不允许使用static修饰
  • 如果外部方法是成员方法,则该内部类可以直接访问外部类的所有属性
  • 如果外部方法是静态方法,则该内部类不能 直接 访问外部类的成员属性,需要有对象
  • 局部内部类可以直接访问外部方法的局部变量,但是需要加final修饰 , 从1.8开始 final可以省略
  • 也就是说,如果局部内部类用了外部方法的局部变量了,那么该局部变量就等于加final修饰了,值不能更改了
  • 内部类类名 :
  • 如果多个方法的内部类类名不一致 那就是这样 : 外部类类名$1内部类类名
  • 如果内部类类名一致 : 就是这样 : 外部类类名$1内部类类名 , 外部类类名$2内部类类名 , 外部类类名$3内部类类名…

public class OuterClass_03 {
		private static String s1 = "私有化静态";
		private String s2 = "私有化成员";
		
	public void m1() {
		final int i = 100;
		
		class InnerClass {
			// static int x=2;
			public void m3() {
				System.out.println(s1);
				System.out.println(s2);
				System.out.println(i);
			}
		}
		// 不能在更改
		// i=2;
		// 局部内部类只能在方法内部使用
		// 创建内部类对象
		InnerClass innerClass = new InnerClass();
		innerClass.m3();
	}
	public static void m2() {
		final int i = 100;
		class InnerClass {
			public void m3() {
				System.out.println(s1);
				// 静态方法中的内部类,不能直接访问外部类的成员属性,需要创建外部类对象才行
				// System.out.println(s2);
				System.out.println(i);
			}
		}
		// 不能在更改
		// i=2;
		// 局部内部类只能在方法内部使用
		// 创建内部类对象
		InnerClass innerClass = new InnerClass();
		innerClass.m3();
	}
	public static void main(String[] args) {
		OuterClass_03 outerClass_03 = new OuterClass_03();
		outerClass_03.m1();
		m2();
	}
	}
四、匿名内部类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值