内部类
- 一个java文件中,必须有且仅有一个public修饰class,且修饰的class名字必须跟文件名一样。
- 内部类分类
- 成员内部类
- 临时内部类
- 静态内部类
- 匿名内部类
成员内部类
public class Outter {
public String name ;
public int age ;
public int i = 1 ;
// 成员内部类
public class Inner{
public String sex ;
public int i = 2 ;
public void innermethod(){
System.out.println("你好啊,今天才星期2,都趴下了。");
}
}
public void outterMethod(){
System.out.println("--- outterMethod ---");
}
}
- 成员内部类对象必须必须依赖外部类的对象
- 当外部类跟内部类有冲突,this表示内部类的,Outter.this表示外部类中的。
- 内部可以外部的,外部不能访问内部的。
- 成员内部类不能定义静态的内容
- 成员内部类编译成class文件后, 外部类$内部类
临时内部类
public void outterMethod(){
int a = 1 ;
class TempClass{
public String tempName ="";
public void tempMethod(){
}
}
TempClass t = new TempClass();
t.tempMethod();
}
- 一般不会用到。
静态内部类
public class Outter2 {
public String name = "outName" ;
public static int age ;
public int i = 1 ;
static class StaticClass{
public String sex = "男" ;
public int i = 2 ;
public void staticMethod(){
System.out.println("----staticMethod---");
}
}
public void outterMethod(){
System.out.println("----outter2Method-----");
}
}
- 静态内部类不需要依赖于外部类对象,可以直接new一个静态内部类的对象
- 静态内部类不能访问外部类的非静态内容
匿名内部类
MyInterface my = new MyInterface(){
public String name = "hello";
@Override
public void interMethod() {
System.out.println("---interMethod---"+name);
}
};
my.interMethod();
DemoClass demo = new DemoClass(){
public String name ;
@Override
public void demoMethod() {
System.out.println("-----override demo method ------");
method2();
}
public void method2(){
System.out.println("----- demo method2 ------");
}
};
demo.demoMethod();
反射
一、获取这个类的Class
有三种方法:
// 第1种方式:
Class clazz = Person.class ;
// 第2种方式:
Class clazz2 = Class.forName("com.blb.seven01.Person");
// 第3种方式:
Person p = new Person();
Class clazz1 = p.getClass();
二、创建对象
有两种实现方式:
-
调用无参构造方法去创建对象(前提是该类必须存在无参构造方法)
Person person = (Person) clazz.newInstance();
使用newInstance -
先获取构造器,通过构造器来实例化对象
getConstructor : 获取public类型构造器
getDeclaredConstructor:获取定义的构造器(包括私有的)
// 获取某一个构造器
Constructor c1 = clazz.getDeclaredConstructor(String.class,int.class);
c1.setAccessible(true);//调用私有的都需要给权限
// 通过构造器来实例化对象,需要传具体的参数值 new Person("zhangsan",18)
Person person = (Person) c1.newInstance("zhangsan",18);
获取本类属性
getDeclaredFields:获取本类所有的属性,包括私有的
getFields : 获取所有的public的属性,包括继承过来的。
/*
* getDeclaredFields:获取本类所有的属性,包括私有的
* getFields : 获取所有的public的属性,包括继承过来的。
*
*/
// 获取Class对象
Class clazz = Student.class;
// 获取构造器
Constructor c = clazz.getDeclaredConstructor(String.class);
c.setAccessible(true);
// 通过构造器获取对象
Student s = (Student) c.newInstance("student");
// 获取所有的声明的属性
// Field[] fields = clazz.getDeclaredFields();
// for (Field field : fields) {
// System.out.println(field.getName());
// }
// 获取某一个指定的字段
Field f = clazz.getDeclaredField("number");
// 因为是私有的,需要给权限
f.setAccessible(true);
// 设置值的时候需要指定对象,因为属性不能独立存在,需要依赖对象
f.set(s, "102");
System.out.println(s);