学习补充

同步和异步、阻塞和非阻塞的区别


  • 同步和异步、阻塞和非阻塞的区别
    同步和异步主要指的是具体的通信过程。(从发出请求到接收响应的过程)。
    同步的特点就是调用者等待返回的结果。
    异步的特点就是调用者发起请求,被调用者通过回调等形式来通知调用者。
  • 阻塞和非阻塞主要指的是调用者在等待返回结果时的状态。阻塞时,在调用结果返回前,当前线程会被挂起,一直等到得到结果之后再返回。非阻塞时,如果当前线程不会马上得到结果,那么调用者不会阻塞当前线程,但是这种方式可以了解到,调用者需要定时轮询查看处理状态。

hashcode问题


  1. 什么是hashcode
    hashcode主要是用来在散列存储结构中确定对象的存储地址。通过hashcode找到数组的下标,进而找到对应的链表。
  2. java中规定
    ① 如果两个对象相同,那么它们的hashcode值一定相同。
    ② 如果两个对象的hashcode相同,那么它们不一定相同。
  3. 解释
    如果两个对象的hashcode相同,只能得到两个对象对应的是同一个数组的下标,它们可能是同一个对象,也有可能只是在同一条链表上而已。

transient关键字


作用:transient关键字修饰的变量将不会被序列化。
注意:transient关键字只能修饰变量不能修饰类和方法、一个静态变量不会因为被transient修饰而序列化。

@ToString
@Data
public class UserVO implements Serializable {

    private String username;
    private transient String pwd;
}

public class Test {

    /**
     * 将对象写入到磁盘
     * @param obj
     * @throws Exception
     */
    private static void writeObjToDisk(Object obj) throws Exception {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E:/test/user.txt"));
        objectOutputStream.writeObject(obj);
        objectOutputStream.flush();
        objectOutputStream.close();
    }

    /**
     * 将磁盘上的对象读出来
     * @return
     * @throws Exception
     */
    private static Object readObjFromDisk() throws Exception {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E:/test/user.txt"));
        UserVO userVO = (UserVO) objectInputStream.readObject();
        return userVO;
    }

    public static void main(String[] args) throws Exception {
        UserVO user = new UserVO();
        user.setUsername("Sunpy");
        user.setPwd("123456789");
        System.out.println(user.toString());

        writeObjToDisk(user);

        UserVO serializableUser = (UserVO) readObjFromDisk();
        System.out.println(serializableUser.toString());
    }
}

final关键字


  1. final修饰的类:final修饰的类无法被继承、final修饰的类中的成员方法默认都为final。
  2. final修饰的方法:final修饰的方法不能被子类重写。
  3. final修饰的变量:final修饰的变量可以先声明,后赋值。final修饰的基本类型变量不可修改,final修饰的引用类型,不能再指向其他对象(只是指向了对象的地址,被指向的对象的值可以改变)。
  4. final修饰的方法变量:如果变量为基本类型,不会改变。如果变量为引用类型,对象本身不允许改变,但是对象的属性值可以改变。

static关键字


  1. static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
  2. static方法一般称作静态方法,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

组合与继承的区别


  1. 组合通常就是在新类中使用现有类的功能,而不是现有类的结构。新类中通过使用现有类的功能而完成新的功能。组合这种形式就是一种显式地调用。
  2. 继承的意思就是父类和子类是同一类的东西。只是通过使用新类来扩展父类的功能。子类只是父类的一种特殊的类型。继承是一种隐式地调用。
  3. 组合说到底是通过has-a(有一个)这种方式来表达两个事物之间的关系。继承是通过is-a(是一个)这种方式来表达两个事物之间的关系。

接口与抽象类的区别


  1. 什么是接口:
  • 接口本身是一种对行为的一种抽象,实现接口的类将按照接口的规范约束行为。例如:人可以跑,狗,猫都可以跑。人,狗,猫多种动物,只要可以跑就可以实现跑这个行为的接口。
  • 我们开发中经常说给别人提供接口,而不是说给别人提供实现类。我们将属性私有,通过接口中的行为来操作。这样封装了内部的实现。
  • 当我们对外提供接口,而不是直接暴露实现类,这样调用的类就实现了与提供类之间的解耦(外观模式),在mvc模式中用的特多。
  • 当我们定义了一个接口,它只是一种行为的抽象,我们也可以提供多种实现,这样保证不用每次因为实现要改变而不停的改变实现类(策略模式)。
  1. 什么是抽象类:
  • 抽象类本身是一种对事物的抽象。将多个事物抽象出一种共同特征的事物。例如:狗是动物,猫是动物,人也是动物。动物就是抽象类。猫狗人就是继承动物的子类。
  • 抽象类中既可以定义抽象方法,也可以定义普通方法。子类继承抽象类必须重写抽象方法。
  1. 区别
  • 一个类可以实现多个接口,只能有一个继承抽象类(java单继承多实现)。
  • 接口只能定义抽象方法,但是抽象类中可以定义抽象方法也可以定义普通方法。

你可能感兴趣的:(学习补充)