- 早上查题,背一遍然后检查自己一遍以上
- 中午有时间就背一遍以复习昨天的为主
- 晚上背一遍,第二天中午再看一眼:day+1
- 第四天课间看一遍:day+3
- 第七天课间看一遍:day+6
- 第十五天课间看一遍:day+14
一个子类主继承谁?父类(父类继承资源),接口留下要求
System.gc()调用垃圾回收机
finalize: 当对象被垃圾回收器回收的时候由垃圾回收器运行。在垃圾对象被删除前执行
1.需要引用赋值为null,当赋值是null时,没人引用了,就成垃圾了
2.所在类重写finalize方法,可以【有些对象和流捆绑,在垃圾删除前用它关闭流】默认是什么都不写的,空的。
3.手动调用 System.gc()调动垃圾回收机就可以调用这个方法。因java的垃圾回收机是线程机制的,不一定什么时候回去执行删除程序删除垃圾。手动调用确保删除。
基本数值类型转换为包装类
方法1:装箱
方法2:通过包装类构造器
方法3:通过包装类的静态valueOf方法
包装类转换为基本数值类型
方法1:拆箱
方法2:通过包装类实例方法xxxValue
字符串转换为包装类
方法1:通过包装类构造器
方法2:通过包装类的静态valueOf方法
包装类转换为字符串
利用包装类的toString()方法
字符串转换为基本数值类型
利用包装类的两个静态方法parseXXX()、valueOf()之一
Integer valueOf = Integer.valueOf(123);
int parseInt = Integer.parseInt("123");
自动拆/装箱:
- Integer i3 = 111;//把一个基本数据类型直接当对象使用,自动装箱
- System.out.println(i3-1);//把一个对象直接当基本数据类型来使用,自动拆箱
包装类equals比较
包装类已经重写了equals方法,所以该方法实际上是先比较两个包装类对象类型是否相同。
如果相同再比较包装类的内置属性值是否相同,如果都相同则返回true,否则返回false。
String的五种构造器
1.构造器:
1.无参
String s1 = new String();
String s2 = null;
//生成了字符串对象,只不过内容没有,但是空间存在,可以正常使用方法。
2.参数为字符数组的
字面量的隐藏代码:
char c1[] = {'a','b','c'};
String s3 = new String(c1);
3.参数为字符串对象的:
String s5 = new String("abc");
4.参数为字节数组的
解决字符串编码问题:
String Client = new String("abc你我他".getBytes("utf-8"),"iso8859-1");
String Server = new String(Client.getBytes("iso8859-1"),"utf-8");
字面量 变量 常量
变量常量是引用,变量值可变,常量值固定
字面量是值
// str 是变量 "hello"是字面量
// number 是变量 10是字面量
String str = "hello";
int number = 10;
//height 与 name 都是常量 100与“java”同样是字面量
final int height = 100;
final String name = "Java";
String对象在常量池中诞生,有且仅有一份,所有内容相同的字面量是同一份内存
String s = “abc”;//诞生了一个对象
String s1 = new String(“abc”);//诞生了new 的对象,如果“abc” 之前存在则不需要诞生,如果不存在则需要诞生
intern :
String s6 =s5.intern();
//返回一个常量池中的字符串对象,如果当前池中有对象则直接返回对象的地址,
//如果没有则先把当前值放到常量池中去再返回当前的地址
//能够强行把堆空间的字符串升到常量池中去
SimpleDateFormat格式化参数
执行格式化方法format前,需要在SimpleDateFormat的构造器中输入以下格式化参数。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String date = sdf.format(dat);
String str = new String(“hello world”); 一共创建了几个对象?
正确答案:两个对象(实例对象),我们慢慢分析String str = new String(“hello world”),String是数据类型,str是个变量(全称为引用变量),str也可以称为String的引用即可,而new String()呢,创建了一个String 的实例对象,而"hello world"也创建了一个String的实例对象(在字符串常量池中,无该字符串,则创建,有则使用,最终编译期的字符串常量池会在运行时并入到运行时常量池。这里对于new的操作,因为有一个构造方法是接受一个String对象作为参数的
重写Treemap的排序方法
- 在要被排序的类中实现Comparable,重写compareTo方法
- 在构造函数中new Comparator,匿名内部类实现接口,重写compare 方法。在new TreeMap实例化时,传入此参数(排序器)。
TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
compareTo是字符串。包装类的方法。字符串根据字典顺序比较。返回int:0相等。正数大于,负数小于。
面向对象开发中的七大设计原则
软件开发中最核心的思想就是“高内聚,低耦合”,主要的目的也是为了方便后期的维护和变更。下面的设计原则也是依靠这个核心思想衍生出来的。
1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:单一职责原则想表达的核心思想就是“高内聚”,一个模块只完成一项功能。在面向对象设计中,一个类只应该负责一项职责,如果同时承担太多职责,就等于把这些职责耦合在了一起。
后面很可能因为某项职责的变更而导致其他职责的削弱或者抑制其他职责的能力。
2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:任何时候都可以用子类型来替换父类型。
3、依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】:面向接口编程,声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代,请参考下面的里氏替换原则。
4、接口隔离原则【INTERFACE SEGREGATION PRINCIPLE】:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口。
5、迪米特法则【LOW OF DEMETER】:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。(低耦合)
6、开闭原则【OPEN CLOSE PRINCIPLE】 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
7、组合/聚合复用原则【Composition/Aggregation Reuse Principle(CARP) 】:尽量使用组合和聚合,少使用继承的关系来达到复用的原则。类与类之间简单的说有三种关系,IS-A关系、HAS-A关系、USE-A关系,分别代表继承、关联和依赖。
其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是HAS-A关系,合成聚合复用原则想表达的是优先考虑HAS-A关系而不是IS-A关系复用代码