java知识学习
1. java是面向对象编程,面向对象思想在解决问题的时候,以事物为单位,考虑其内部的行为和属性。通过对象之间的协同合作 解决问题。
2. java的4大基础特性:抽象,封装,继承,多态。
抽象:父类为子类定义一些属性和行为,具体行为根据子类的需要去实现。类名使用abstract修饰。
封装:将类中的成员变量通过private修饰,隐藏对象内部实现,在类中提供get和set方法供外部调用。
继承:子类继承父类的属性和方法(方法或属性使用private修饰无法继承),提高代码复用性。使用extends关键字。
多态:主要为重载和重写。重载为同一类中方法名相同,参数不同。重写为子类继承父类或实现接口,对父类或接口中的方法 进行重新编辑。
3. Java中final的作用:final用来修饰java中的类,成员变量,方法;final修饰的类不可以被继承,成员变量和方法可以被继承但 不能被重写。final修饰的基本数据类型,直不会改变;修饰的引用类型,地址不会改变,值可以改变。
String被定义成final,String数据保存在常量池中(已经存在的值,不会创建),而String适用范围广泛,如果可变存在线程安 全问题;
String s = null;
String s1 = "i" + s; //s1 = "inull"
System.out.println(s1);
如上代码描述,当s为null进行+运算时,会将null转化为字符串null进行运算。
4. 字符串反转的4种方式:1将字符转倒叙遍历,取出char值拼接;2将字符串转换成char数组倒序便利;3对字符串数组进行递归 遍历;4使用StringBuilder或StringBuffer的reverse()方法,该方法从字符串中间开始将对应字符串交换位置,向周围扩散。 (效率高)
5. java中的设计模式:
工厂模式:将具有复用性的方法和变量提出出来放到一个工具类中,各方法和变量通过static修饰,方便其他使用方直接调 用。
抽象工厂模式:接口中定义公共的行为,各个实现类根据具体的业务逻辑去实现各自的功能。
单例模式:在程序中只存在一个对象,该对象对外提供方法获取当前对象的地址。饿汉模式,编译时创建对象; 懒汉模式: 第一次需要使用对象时创建,以后使用时直接调用。还可以通过枚举类实现。
原型模式:使用java中的克隆实现;保证两个类的值一样,地址不同。由于object类中的clone()方法为protected,所以需要在 使用clone方法的类中重写该方法;且当前类必须实现Cloneable接口。因为Object中的clone()对此有要求,如果为 实现该接口会抛出异常。
适配器模式:就是在原有类的基础上实现新功能,主要体现在继承和实现接口。
代理模式:使用代理类调用原始类的方法,代理类中可以对原有方法执行前后增加逻辑。分为动态代理和静态代理
6. java中的克隆:存在深拷贝和浅拷贝,浅拷贝为将当前对象中所有的值和引用拷贝到新对象中,深拷贝会将当前对象中的引用 都创建新对象进行拷贝。如下代码所示,当前类中list在浅拷贝克隆完成后,两个对象的list指向同一地址。
public class C implements Cloneable{
private String name;
private List<String> list = new ArrayList<>();
深拷贝实现代码如下:
@Override
public C clone(){
C c = null;
try {
c = (C) super.clone();
List<String> list1 = new ArrayList<>();
list1.addAll(this.list);
c.setList(list1);
} catch (CloneNotSupportedException e){
e.printStackTrace();
}
return c;
}
深拷贝还可以通过串行化实现:
public C deepClone(){
C c = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
c = (C) ois.readObject();
} catch (Exception e){
e.printStackTrace();
}
return c;
}
串行化需要进行流的写入和读取,效率较差。
由于Object中的clone()方法为浅拷贝,所以需要定义为protected类型,让子类根据具体情况去实现。
扩展:对于使用clone()方法必须实现一个声明接口Cloneable,在知乎上看到一个比较合理的解释,这是Java设计的一个缺陷。(认为其合理是因为,既然我们使用过程中需要重写clone()方法,那也就可以理解为我们重写了就是需要这个方法,故认为加这个声明接口没有任何意义,当然可能是因为早期和现在的有些差异导致。)
7. java中的枚举类:枚举类类似于我们定义的一个常量类,不能继承也不能作为超类,可以重载。可以用在switch语法中。
枚举类相对于常量类的优势:1枚举类比常量类安全一些,如果一个方法需要传入一个String类型数据,那么可以传入任意 String类型,但是使用枚举类,只能传入枚举类中定义的对象。2不需要命名空间,类名可以看出类中的存放的参数含义;常量 类需要在变量名进行统一声明。
枚举类中的方法:
ordinal()返回的是当前变量在枚举类中的序号。
name()和toString()方法一样都是返回当前枚举类的名称;
equals()由于枚举类中的成员都是单例的,所以只需要使用==去比较。
compareTo()先比较两个枚举类型是否相同,不同则抛出异常,相同的话,返回调用方序号减去被比较方序号的值。
8. StringBuffer和StringBuilder:两者都继承AbstractStringBuilder,所以方法都一样,只是StringBuffer的方法加了同步锁,是线 程安全的。
9. finally,finalize:finally用于try catch语句,正常执行和捕获和抛出异常后执行。finally中的语句会在方法返回前执行。finalize 用来清理他属于的对象。
10. throw和throws:throw作用在方法体,抛出一个异常,而throws是声明一个异常,作用在方法头。
11. 泛型:没有具体的类型,根据使用过程中传入参数决定。如List<泛型>。
扩展:其实通过Object也能实现泛型的作用,但为什么要引入泛型的概念?如果使用Object,我们的返回参数需要做一个转型 来返回,但是通过泛型无需转换。
12. transient关键字:表示当前变量不被序列化,节省空间。
13. >> 1右移运算符(右移1位),正数高位用0补齐,负数高位用1补齐;>>>无符号运算符,高位都用0补齐。最终转成10进制 不一样。
本文深入讲解Java的基础特性,包括面向对象编程原则、设计模式、字符串操作、克隆机制及枚举类的应用等,并探讨了泛型、关键字final及transient的使用场景。

被折叠的 条评论
为什么被折叠?



