JavaSE入门:JVM四大特性:面向对象——类关系与内部类

类关系

继承

使用extends表示

				类A extends 类B
				接口A extends 接口B,接口C
				类和类是单继承,接口和接口是多继承

实现

implements

				类A implement 接口B,接口C
				类和接口是多实现

依赖

	一个类的方法中的局部变量是另外一个对象的引用
	关系是临时性的,方法执行结束 关系就不存在了

关联

	一个类的成员/静态变量是另一个类对象的引用
	这个关系是长期的

聚合

	整体和局部分离,各自具有生命周期
	把好多有意义的模块聚合到一起使用,形成一个有意义的功能,就算这个功能结束也不会影响每个小模块的生命周期(就是有其他的调用)。

组合

	关系要强于聚合,也有的叫做强聚合
	同样是整体和局部,只不过不可分离,局部没有生命周期
	比如A保存B的引用,这个引用一般是自己创建的,(A的构造方法中或者成员变量直接初始化另一个类对象),	这样每创建一个A对象,都会去创建一个B对象,A对象销毁,B对象也会销毁,成为垃圾数据。

代码奉上:

public class ClassRelation_01 {
//	关联关系:成员变量是另一个类对象引用
	A a = new A();

	public static void main(String[] args) {
//		依赖关系:局部变量是另一个类对象引用
//		B b=new B();
	}
}
class A {
}
//继承关系,类单继承
class B extends A {
}
interface C {
}
interface D {
}
//继承   接口可以多继承
interface E extends C, D {
}
//实现关系,多实现
class F implements C, D {

}

内部类

定义

类体中编写的类

作用

可以访问外部类私有化数据

分类

根据它所在位置不同,分为:

普通内部类/成员内部类

可以看作成员变量,类体中方法外没有static修饰的类就是普通内部类/成员内部类。

成员内部类中不能有静态声明;类中可以直接访问外部类所有数据。

怎么在main中打印:通过对象,使用外部类对象.new内部类()来创建内部类对象。

代码奉上:

	private static String s1="静态变量";
	private String s2="成员变量";
//	类体中没有static修饰的类  是成员内部类
	class InnerClass{
//		不能静态声明
//		static String s3="";
//		public static void m1();
		public void m1() {
//			可以直接访问外部类所有属性
			System.out.println(s1);
			System.out.println(s2);
		}
//		可以再套内部类
		class A{
			
		}
	}
	public static void main(String[] args) {
//		怎么打印
//		外部类对象
		OuterClass_01 oc=new OuterClass_01();
//		使用外部类对象.new内部类()来创建内部类对象
		InnerClass inner=oc.new InnerClass();
//		或者等价于
//		InnerClass inner=new OuterClass_01().new InnerClass();
		inner.m1();
		System.out.println(inner);
	}

静态内部类

可以看作静态变量,类体中方法外用static修饰的类就是静态内部类

在静态内部类中可以声明成员属性也可以声明静态属性;但是内部类中不能直接访问外部类的成员属性(需要使用外部类对象调用外部类成员方法)

怎么打印:访问静态属性 时 OuterClass_02.类名可以省略
非静态属性时,使用new内部类()来创建内部类对象

public class OuterClass_02 {
	private static String s1="静态变量";
	private String s2="成员变量";
//	类体中有static修饰的类  是静态内部类
	static class InnerClass{
//		能静态声明
		static String s3="";
		public static void m2() {
			
		};
		public void m1() {
//			可以直接访问外部类静态属性
			System.out.println(s1);
//			不能直接调用外部类成员属性
//			System.out.println(s2);
//			需要使用外部类对象调用成员属性
			System.out.println(new OuterClass_02().s2);
		}
//		可以再套内部类
		static class A{
			
		}
	}
	public static void main(String[] args) {
//		怎么打印
//		访问静态属性        OuterClass_02.类名可以省略
		 OuterClass_02.InnerClass.m2();
//		使用外部类对象.new内部类()来创建内部类对象
		InnerClass inner=new InnerClass();
		inner.m1();
		System.out.println(inner);
	}
}

局部内部类

等同于局部变量

这里分为成员方法里面还是静态方法里面,成员方法里面内部类中可以直接访问外部类所有的属性,如果是静态方法,不能直接访问外部类成员属性,需要创建对象去访问。

不管是静态方法还是成员方法,都不能用static修饰内部类;外部的方法的局部变量都不能二次赋值(如同final修饰);局部内部类都不可以有静态声明。

类名规则:如果多个方法的内部类类名不一致,就是 外部类类名$1内部类类名;如果内部类类名一致 , 就是 外部类类名$1内部类类名 , 外部类名$2内部类类名 依次类推

注意:局部内部类想要调用必须现在外部的该方法里面先调用

	private static String s1 = "静态变量";
	private String s2 = "成员变量";
	public void m1() {
		int i = 10;
// 		不能改i的值,等于是final修饰
//		 i=2;
		class InnerClass {
// 			不能有静态声明
//		 	public static void m3(){}
			public void m4() {
				System.out.println(s1);
				System.out.println(s2);
				System.out.println(i);
			}
		}
// 		使用局部内部类 必须在方法内部调用
		InnerClass inner = new InnerClass();
		inner.m4();
		System.out.println(inner);
	}
	
	public static void m2() {
		int i = 10;
		// 不能更改i的值,等于是final修饰
		// i=2;
		class InnerClass {
			// 不能有静态声明
			// public static void m3(){}
			public void m4() {
				System.out.println(s1);
				// 静态方法中的内部类,没有办法直接访问外部类的成员属性,需要用对象调用
				// System.out.println(s2);
				System.out.println(new OuterClass_03().s2);
				System.out.println(i);
			}
		}
		// 使用局部内部类 必须在方法内部调用
		InnerClass inner = new InnerClass();
		inner.m4();
		System.out.println(inner);
	}
	public static void main(String[] args) {
		OuterClass_03 oc=new OuterClass_03();
		oc.m1();
		OuterClass_03.m2();
		
	}

}

匿名内部类

调用方法的时候,需要传入一个接口的实现类对象,这个时候可以不传递实现类对象,传递一个匿名内部类。

语法 : 方法( new 接口名(){ 类体 ;} )。

不能有静态声明(静态变量 / 静态方法 都不行),但是可以声明常量(public static final int i = 10;(静态常量));不能直接访问外部类的成员属性,需要使用对象调用

	private static String s1 = "静态变量";
	@SuppressWarnings("unused")
	private String s2 = "成员变量";
	
	public static void main(String[] args) {
		
//		几乎等同于实现,只不过实现这是一次性的,如若只调用一次可以用这个,较简单
		m1( 1,new IUserService() {
			@SuppressWarnings("unused")
//			静态常量 
			public static final int i = 2;
			@SuppressWarnings("unused")
//			可以声明成员方法
			public void m1() {

			}

			@Override
			public void login() {
				System.out.println("阿道夫v");
				System.out.println(this);
				System.out.println(s1);
//			 	需要使用对象调用,不能直接调用外部类的成员属性
// 				System.out.println(s2);
			}
		});
	}

	public static void m1(int i ,IUserService userService) {
		userService.login();
	}
}
//接口
interface IUserService {
	public void login();
}

猜你喜欢

转载自blog.csdn.net/lfz9696/article/details/107755711