JavaCore学习 内部类

Definition:定义在一个类里的类被称作内部类

为什么要使用内部类?

内部类是共享数据最最简单的方式之一
还能描述类与类的专属关系

//内部类同样是类 编译之后同样会形成.class文件
  只是其命名规则 为 外部类名字$内部类名字.class

内部类按照能使用外部类的哪些属性或方法分为四类:局部内部类,静态内部类,匿名内部类,成员内部类

成员内部类:    外部类的所有[静态+非静态]成员[属性+方法]

        如何创建其对象:
        Outer.Inner in = new Outer().new Inner();

public class TestMemberInner{
	public static void main(String[] args){
		//我想创建那个内部类对象
		Outer.Inner in1 = new Outer().new Inner();
		Outer.Inner in2 = new Outer().new Inner();

		Outer out = new Outer();
		Outer.Inner in3 = out.new Inner();
		Outer.Inner in4 = out.new Inner();

	}
}
class Outer{
	int a = 3;				//成员变量 = 实例变量 = 属性
	static int b = 5;		//静态变量

	class Inner{
		int x = 7;
		public void test(){
			System.out.println(a);//true
			System.out.println(b);//true
			System.out.println(x);//true
		}
	}
}


静态内部类:    外部类的静态成员[属性+方法]

        如何创建其对象:
        Outer.Inner in = new Outer.Inner();

    *: 使用静态内部类 我们能够共享到的只有外部类的静态成员
        静态成员我即便不是内部类也能直接共享访问
        所以静态内部类的存在 并不是为了共享数据的
        静态内部类是为了描述类与类的专属关系

public class TestStaticInner{
	public static void main(String[] args){
		//如何创建静态内部类对象~
		Outer.Inner in = new Outer.Inner();
		in.test();
	}
}
class Outer{
	int a = 3;
	static int b = 5;

	static class Inner{
		int x = 7;
		static int y = 9;

		public void test(){
			//System.out.println(a);//false
			System.out.println(b);//true
			System.out.println(x);//true
			System.out.println(y);//true
		}
	}
}


局部内部类:    
    定义在静态方法:只能共享外部类的静态成员
    定义在非静态方法:能够共享外部类的所有成员
    
    另外还有其所在的外部类方法体当中的局部变量
        只是JDK8.0之前必须加final修饰它们
        从JDK8.0开始不需要加final 默认就是final

    如何创建其对象:
        Inner in = new Inner();
        *: 有位置限定 定义完成之后 所在方法结束之前

public class TestLocalInner{
	public static void main(String[] args){

	}
}
class Outer{
	int a = 3;
	static int b = 5;

	public void gogo(int c){
		int d = 7;

		class Inner{				//局部内部类
			int x = 9;

			public void test(){
				System.out.println(a);//true (取决于所在gogo是否是非静态)
				System.out.println(b);//true
				System.out.println(c);//true (取决于JDK版本 8.0及之后可以)
				System.out.println(d);//true (取决于JDK版本 8.0及之后可以)
				System.out.println(x);//true
			}
		}

		Inner in = new Inner();
		in.test();
	}
}


    
匿名内部类:

        new 父类/接口(给父类构造方法传参){
        完成抽象方法的具体实现 或者 方法覆盖;
    }

    *: 匿名内部类没有名字 但是依然是个类 有.class文件
        以外部类名字$序列编号 命名

    *: 匿名内部类能够共享外部类的哪些成员?
        取决于定义它的位置
        ta可能等价于上述三种的任意一种

public class TestAnonyInner2{

	public static void main(String[] args){
		//使用标准语法完成一个学生类 并且创建对象调用方法
		Student stu = new Student();
		stu.eat();

		//使用匿名内部类语法创建一个老师对象 调用其方法
		Person tea = new Person("孔子"){
			@Override
			public void eat(){
				System.out.println("老师吃薯条");
			}
		};
		tea.eat();


		//我想用匿名内部类语法创建一个医生对象 并且调用方法
		Person bq = new Person("扁鹊"){
			@Override
			public void eat(){
				System.out.println("医生吃火腿");
			}
		};
		bq.eat();
	}
}
abstract class Person{
	String name;
	public Person(String name){
		this.name = name;
	}
	public abstract void eat();
}

class Student extends Person{
	public Student(){
		super("子贡");
	}
	@Override
	public void eat(){
		System.out.println("学生吃汉堡");
	}
}

//Java当中常用的共享数据的方式:
    1.使用静态变量完成共享~
    2.使用参数传递完成共享~
    3.使用内部类完成共享~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry鹿17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值