💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 构造器 * 仅当系统没有提供任何构造器时,系统才会提供默认构造器; * 在构造器中,使用this调用另一个构造器:this\(\) * 在构造器中,使用super调用父类构造器:super\(\) ### 构造器处理步骤 1. 所有数据域被初始化为默认值\(0、false或null\); 2. 按照类声明中出现的次序,依次执行所有域初始化语句和初始化块; 3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体; 4. 执行这个构造器主体; ### 更改器方法与访问器方法 对实例域做出修改的方法被称为更改器方法(mutator method),仅访问实例域而不进行修改的方法被称为访问器方法(accessor method) ### Class * 静态嵌套类 * 内部类 * 局部类:方法内定义的类称为局部类 * 匿名内部类 * 匿名子类 ### 匿名内部类 ``` public static void main(String[] args) throws InterruptedException { new Thread(getTask()).start(); } private static Runnable getTask(){ return new Runnable() { @Override public void run() { System.err.println("这是匿名内部类"); } }; } ``` ### 抽象类 * 任何包含一个或多个抽象方法的类都必须被声明为抽象的; * 抽象类的所有子类,要么实现超类中的所有抽象方法,要么自己也声明为抽象的; ### 内部类与嵌套类的区别与联系 * 内部类的方法可以访问外部类的实例变量 * 当静态嵌套类的实例不需要知道它属于外部那个类的实例时,使用静态嵌套类;否则使用内部类; * 静态的嵌套类只能通过对象访问外层包含类的非静态成员;也就是说嵌套类不能直接引用包含类的非静态成员变量; * 内部类可以访问外部类的所有成员变量和方法; * 内部类对象拥有一个对外部类对象的引用\(outer\); * JavaSE8之前,必须把从局部类访问的局部变量声明为final; ### 匿名子类 ``` ArrayList<String> list = new ArrayList<String>(100) { public void add() { super.add("hello"); } }; ArrayList<String> list1 = new ArrayList<String>() { { add("heel"); } }; ``` ### 静态内部类 * 在内部类不需要访问外部类对象的时候,应该使用静态内部类; * 与常规内部类不同,静态内部类可以有静态域和方法; * 声明在接口中的内部类自动成为static和public类; ### 类设计技巧 * 一定要保证数据私有; * 一定要对数据初始化; * 不是所有的域都需要独立的域访问器和域更改器 * 将职责过多的类进行分解 * 类名和方法名要能够体现它们的职责 * 优先使用不可变的类 ### 知识点 * 在将超类转换为子类之前,应该使用instanceof进行检查; * 在调用x.toString\(\)的地方可以用"" + x代替 * instanceof\(如果被检查对象为null,则结果返回false\) ``` String str = null; if (str instanceof Object) { // 不产生异常result is false System.err.println("yes"); } System.err.println("no"); ``` * 内部类不能声明静态成员; ``` public class ClassDemo { public static void main(String[] args) { System.err.println(ClassDemo.Student.num); System.err.println(ClassDemo.Teacher.code); } class Student { private final static int num = 10; // ok // private static int code = 10; // 编译报错 } static class Teacher { private static int code = 10; // ok } } ``` * 双括号初始化 ``` public static void main(String[] args) throws Exception { init(new ArrayList<String>() { { add("luoyoub"); add("robert"); } }); } private static void init(List<String> list) { list.stream().forEach(System.err::println); } ``` * 一个方法覆盖另一个方法时可以指定一个更严格的返回类型 ``` class Student extends Person { public Student get() { return (Student) new Object(); } } class Person { public Person get() { return new Person(); } } ``` ### Object ![](../assets/20171002105010.png)