java知识

本文深入讲解Java的基础特性,包括面向对象编程原则、设计模式、字符串操作、克隆机制及枚举类的应用等,并探讨了泛型、关键字final及transient的使用场景。

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进制         不一样。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值