JAVA 内部类 inner class

内部类:
在一个类的内部定义的类称为内部类。
类的内部:
第一:与属性或方法 同级
内部类
这个类与外部类的每个对象是一对一的关系。Person与Birthday
静态内部类
这个类与外部类是1对1的关系。每个对象共享这个内部类对象。Hero和Crystal
第二:在方法内部
本地内部类
在方法中定义的类(局部类,出了方法就没了)
匿名内部类
没名字,与抽象类和接口配合使用。创建内部类的同时创建对象。

使用频次:
匿名类:非常频繁
静态内部类:单例,系统的部分类(Map.Entry<K,V>)
内部类:Birthday和Person
本地内部类:几乎不用

//一个文件(xx.java)里面可以定义若干个类。
//定义类的语法格式:
// class 类名{属性和方法}
//每个类定义完以后,都能正常的使用。
//和你在每一个单独定义一个类差不多。

//如果一个文件里定义了多个类。那么这个文件中只能有一个public修饰的类.
//因为编译器会做检查,public修饰的类必须与文件名相同。
//因为文件名只有一个,所以你只能把其中一个类声明为public

//没有用public修饰的类与public修饰的类到底什么区别呢?
//唯一的区别就是类的作用范围不同,public修饰的类,可以跨包使用
//没有public修饰的类,不能跨包使用,只能在本包中使用。


//什么是内部类呢?
//在一个类的内部定义的类 称为内部类。

//什么情况下需要使用内部类呢?
//如果 一个类(Birthday)是为了另外一个类(Person)而存在的,
//那么这个类(Birthday)可以定义为另外一个类(Person)的内部类.

//怎么使用内部类?
//内部类如何创建对象
//外部类.内部类 对象名 = 外部类对象.new 内部类(参数)
//内部类如何使用呢?—访问属性,访问方法
//正常访问 对象名.属性 对象名.方法

//我们见过哪个系统内部类呢?
//Map.Entry<K,V>

class MyClass{
class InnerClass1{
    public InnerClass1() {
        System.out.println("InnerClass1 created..");
    }
}
class InnerClass2{
    public InnerClass2() {
        System.out.println("InnerClass2 created..");
    }
}
void getInnerClass() {
    new InnerClass1();
    new InnerClass2();
}
public static void main(String[] args) {
    new MyClass().getInnerClass();
}
}

//输出:
InnerClass1 created…

InnerClass2 created…


//在一个类的 方法内部 定义的类,称为本地(局部)内部类。

public class LocalClass {

public static void main(String[] args) {

	class A{
		int a;
		int b;
		
		public int getA() {
			return a;
		}

		public void setA(int a) {
			this.a = a;
		}

		public int getB() {
			return b;
		}

		public void setB(int b) {
			this.b = b;
		}

		public void test() {
			System.out.println("本地类的方法");
		}
	}
	
	A a = new A();
	a.setA(100);
	System.out.println(a.getA());
	a.test();
	
}
}

//匿名内部类,它是一个没有名字的本地内部类。
//为什么时候匿名内部类是本地内部类?
//因为匿名内部类是出现在方法里的。

//因为匿名内部类没有名字,因此匿名内部类不能像其他类一样
//正常的创建对象。
//因此 我们创建匿名内部类的同时把对象创建出来。
//抽象类 对象 = new 抽象类(参数){
// 实现抽象类中的抽象方法(有几个实现几个)
//};
//
//接口名 对象 = new 接口名(){
// 实现接口中的全部方法
//};

//与匿名内部类配套使用的是 抽象和接口。

public class NoNameClass {

public static void main(String[] args) {

	
	A a1 = new B();
	a1.test();
	
	int x = 100;
	
	A a2 = new A() {
		@Override
		public void test() {
			int y = x + 20;
			System.out.println("haha"+x);
			aaa();
		}
		
		public void aaa() {
			System.out.println("hello world");
		}
		
	};
	a2.test();
	A a3 = new A() {
		@Override
		public void test() {
			System.out.println("这是匿名类的使用");
		}
	};
	a3.test();
	
	
	MyInterface c = new C();
	c.test();
	
	MyInterface c2 = new MyInterface() {
		@Override
		public void test() {
			System.out.println("我是接口的匿名实现类");
		}
	};
	c2.test();
}
}

//什么是静态内部类,在一个类内部定义的用static修饰的类叫静态内部类
//静态内部类与内部类的区别是什么?
//内部类是属于每个对象的,每个对象都有一个。
//静态内部类是属于类的,大家共享一个。
//如何创建静态内部类的对象呢?
//外部类.静态内部类 对象名 = new 外部类.静态内部类(参数)
//如何访问静态内部类呢?----访问属性,访问方法
//正常访问 对象名.属性 对象名.方法

//什么时候用过静态内部类呢?
//----单例的第三种写法

public class Test2 {

public static void main(String[] args) throws Exception {
	Hero h1 = new Hero("提莫",1000,200);
	Hero h2 = new Hero("盖伦",1500,180);

	
	
	Hero.Crystal crystal = new Hero.Crystal();
	crystal.test();
	
	Class c = crystal.getClass();
	Field hp = c.getDeclaredField("hp");
	hp.setAccessible(true);
	hp.set(crystal, 10000);
	System.out.println(crystal);

}
}

猜你喜欢

转载自blog.csdn.net/weixin_43791238/article/details/89376275