3.24日java学习总结

3.24日java学习总结

内部类的概念

1,一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类,内部类可以使用public,default,protected,private以及static修饰。而外部顶级类只能使用public和default。
2,内部类只是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。例如一个Outer外部类和内部类Inner。编译完成后,会成为Outer.class和Outer$Inner.class两个类的字节码文件。
3,内部类的作用:
(1)内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其它类直接访问。
(2)内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。当外部类不能访问内部类的内部属性
(3)接口只是解决了多重继承的部分问题。而内部类使得多重继承的解决方案变得更加完整

内部类的分类

非静态内部类

1,非静态内部类必须寄存在一个外部类对象里。因此如果有一个非静态内部类对象,那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象
2,非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员
3,非静态内部类,不能有静态方法,静态属性和静态初始化块
4,外部类的静态方法,静态代码块,不能访问非静态的内部类,包括不能使用非静态内部类定义变量,创建实例
5,成员变量访问要点:
内部类方法的局部变量:变量名
内部类属性:this.变量名
外部类属性:外部类名.this.变量名
6,内部类的访问
(1)外部类中定义内部类:new Inner()
(2)外部类以外的地方使用非静态内部类:Outer.Inner varname=new Outer().new Inner()

public class OuterClass {
	innerClass in=new innerClass();
	public void ouf() {
		in.inf();
	}
	class innerClass{
		innerClass(){
			
		}
		public void inf() {
			
		}
		int y=0;
	}
	public innerClass doit() {
		in.y=4;
		return new innerClass();
	}
	public static void main(String[] args) {
		OuterClass out=new OuterClass();
		OuterClass.innerClass in=out.doit();
		OuterClass.innerClass in2=out.new innerClass();
	}
}

静态内部类

1,定义方式:static class ClassName{类体}
2.使用要点:
(1)当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法不能直接访问外部类的实例方法
(2)静态内部类看作外部类的一个静态成员。外部类的方法中可以访问静态内部类的静态成员。

匿名内部类

1,要点:
匿名内部类没有访问修饰符
匿名内部类没有构造方法
匿名内部类编译以后,会产生外部类名$序号为名称的文件,序号以1n排列,分别代表1 n个匿名内部类
2,代码

class OuterClass4{
	public Outlnterface2 doit(){
		return new Outlnterface2(){
			private int i=0;
			public int getValue(){
				return i;
			}
		}
	}
}

内部类向上转型为接口

如果将一个权限修饰符为privat的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中就可以完全隐藏内部类的具体实现过程,可以在外部提供一个接口,在接口中声明一个方法。如果在实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方式实现接口中的同一个方法。\

interface Outlnterface{
	public void f();
}
public class InterfaceInner {
	public static void main(String[] args) {
		OuterClass2 out=new OuterClass2();
		Outlnterface outinter=out.doit();
		outinter.f();
	}
}
class OuterClass2{
	private class InnerClass implements Outlnterface{
		InnerClass(String s){
			System.out.println(s);
		}
		public void f() {
			System.out.println("访问内部类中的f()方法");
		}
	}
	public Outlnterface doit() {
		return new InnerClass("访问内部类构造方法");
	}
}

Class类与Java反射

1.通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问检测和修改描述Java对象本身信息的功能
2.一些访问方法
(1)getPackage:获得该类的存放路径
(2)getName():获得该类的名称
(3)getSuperclass():获得该类继承的类
(4)getInterfaces():获得该类实现的所有接口
(5)getConstructors():获得所有权限为public的构造方法
(6)getConstructor(Class…parameterTypes):获得权限为public的构造方法
(7)getDeclaredConstructor(Class…parameterTypes):获得指定构造方法
(8)getDeclaredConstructor():获得所有构造方法,按声明顺序返回
(9)getMethods():获得所有权限为public的方法
(10)getMethod(String name,Class…parameterTypes):获得权限为public的指定方法
(11)getDeclaredMethods():获得所有方法,按声明顺序返回
(12)getDeclaredMethods(String name,Class…parameterTypes):获得指定方法
(13)getFields():获得所有权限为public的成员变量
(14)getField(String name):获得权限为public的指定成员变量
(15)getDeclareFields():获得所有成员变量,按声明顺序返回
(16)getDeclaredField(String name):获得指定成员变量
(17)getClasses():获得所有权限为public的内部类
(18)getDeclaredClasses():获得所有内部类
(19)getDeclaringClass():如果该类为内部类,则返回它的成员类,否则返回null

你可能感兴趣的:(3.24日java学习总结)