抽象类

  • 抽象类只有方法,没有实现,下面的子类继承父类,并且子类可以有自己的方法,比如Integer、Double包装类继承了Number类,Number类是一个抽象类,只有定义没有实现。如何体现多态?我们可以写父类的方法,但是调用的是不同的子类重写的方法。这就是运行时多态(即“动态绑定”)的典型体现。
1
2
3
4
5
6
7
8
9
public static void printValue(Number value) {
System.out.println(value.doubleValue());
}
public static void main(String[] args) {
Number n1 = new Integer(10);
Number n2 = new Double(3.14);
printValue(n1);
printValue(n2);
}

装箱和拆箱

自动装箱/拆箱就是基本数据类型和包装类的转换。

弊端:如果创建类型不同,会造成GC的负担

1
2
3
4
Integer sum;
for (int i = 0;i <5000 ; i++){
sum += i;
}

就会一直浪费时间装箱拆箱,生成5000个无用的对象,增加了GC的负担。

Java中为什么要有Integer

  • Integer是int被包装成Object对象,对象封装有很多好处,可以把属性和方法结合在一起;
  • 为了支持泛型和集合框架。在创建集合的时候,集合类只能放对象,比如ArrayList

    java是面向对象语言,很多API只能接受对象

什么是集合和泛型?

  • 集合是Java中用来统一存储一组对象的数据结构,比如列表、集合、映射等,属于java.util包
    类型 说明 示例
    List 有序、可重复 ArrayListLinkedList
    Set 无序、不可重复 HashSetTreeSet
    Map 键值对结构,键不可重复 HashMapTreeMap
  • 泛型是 Java 提供的一种类型参数化机制,让你在写集合或类的时候不必固定元素类型,而是用占位符 等代替。

封装继承多态

父类引用指向子类对象,调用的方法在运行时根据对象的实际类型动态决定,实现“同一操作不同实现”。

示例:Person p = new Student(); p.getInfo() 实际调用的是 Student 的重写方法。

抽象类和接口有什么区别?

  • 抽象类是对一类事物的抽象,接口是对能力的抽象。
  • 抽象类可以包含字段、构造方法、普通方法和抽象方法;接口只能包含常量和抽象方法(Java 8+ 允许 default/static 方法)。
  • 类只能继承一个抽象类,但可以实现多个接口。
  • 抽象类不能实例化,只能被继承;接口不能实例化,只能被实现。
  • 父类类型变量不能直接调用子类实现的接口方法,除非强制类型转换。

    抽象类不能被final修饰,final修饰符用于禁止类被继承或方法被重写,抽象类和final是互斥的。String就有final修饰,保证了String类的不可变性和安全性。final主要用于修饰类,方法,以及对象,保证不可变性。

引用不可变是什么?

  • 引用指的是创建出来的变量其实指向了堆内存中的一个对象,这个变量就是一个引用变量
1
StringBuilder sb = new StringBuilder;
  • 这个sb就是一个引用变量,指向了堆内存里一个StringBuilder对象
    • 理解sb为一个遥控器
    • sb指向的对象是电视
      引用不可变指的是,我这个遥控器只能控制这一台电视,不可以控制别的电视(如下,这是非法的),但是可以更改电视播放的内容,(如sb = 123)这是可以的
1
2
3
sb = new StringBuilder("new");

sb.append("123");