cs61b week3 -- Java libraries and packages

(本节是线下课,且视频质量较差,疯狂掉帧与闪屏,只能看PPT和gitBook,理解可能不到位)

1.Java 库

Java拥有一些内置的抽象数据类型可供你使用,它们被打包在Java Libraries中

在 java.util library 有三个比较重要的ADTs:

List: 有序元素集合,包含 ArrayList 和 LinkList
Set: 无序元素集合,无重复元素,包含HashSet和TreeSet
Map: key/values键值对型元素的集合包含HashMap和TreeMap

cs61b week3 -- Java libraries and packages_第1张图片
使用举例:
1.ArrayList

public static List getWords(String inputFileName) {
    List lst = new ArrayList();
    In in = new In();
    while (!in.isEmpty()) {
        lst.add(in.readString()); //optionally, define a cleanString() method that cleans the string first.       
    }
    return lst;
}

public static int countUniqueWords(List words) {
    Set ss = new HashSet<>();
    for (String s : words) {
           ss.add(s);        
    }
    return ss.size();
}

2.HashMap:

public static Map collectWordCount(List words) {
    Map counts = new HashMap();
    for (String t: target) {
        counts.put(s, 0);
    }
    for (String s: words) {
        if (counts.containsKey(s)) {
            counts.put(word, counts.get(s)+1);
        }
    }
    return counts;
}

2.接口总结

关于 interface inheritance 和 implementation inheritane的区别:

  • Interface inheritance: What (the class can do).
  • Implementation inheritance: How (the class does it).

interface 可能混合了 abstract 方法和 defalut 方法

Abstract methods are what.必须被子类 Override.
Default methods are how.

此外

  • 除非你使用关键字 default ,否则一个方法将会被视为 abstract类型
  • 除非你指定访问修饰符,否则方法将是public。

更多有关接口的细节:

  • inteface 能提供变量,但是变量是 public static final类型
  • final意味着变量的值永远不会改变,我们在Proj 0 中使用过,万有引力常数G=6.67e-11
  • 一个类可以 implements 多个 接口

Interfaces:

  • 不能被实例化,不能new interface()
  • 能提供抽象方法与具体方法,抽象方法指只有函数header声明,具体方法指函数里有具体的代码实现
  • 只能提供public static final类型的变量
  • Java 9 为接口提供了 private 方法

3.抽象类介绍

抽象类是介于接口和类之间的一个中间层次。
抽象类与接口,类的相似之处是:

  • 不能被实例化
  • 能提供抽象方法和具体方法

不同之处是:

  • 抽象类中的抽象方法以关键字 abstract 声明,而具体方法不使用任何关键字(接口中具体方法使用default)
  • 能提供任何类型的变量(接口仅有public static final类型)
  • Can provide protected and package private methods
  • 子类只能继承一个抽象类
  • 接口能做的,抽象类也能做,且能做更多

例如:

public abstract class GraphicObject {
    public int x, y;
    ...
    public void moveTo(int newX, int newY) {    ... }
    public abstract void draw();
    public abstract void resize();
}

在Implementations的子类中必须Override 抽象类的所有抽象方法

public class Circle extends GraphicObject {
    public void draw() {    ... }
    public void resize() { ...     }
}

抽象类在Java标准库中的应用:
cs61b week3 -- Java libraries and packages_第2张图片

总结:

  1. 抽象类可以被认为是普通类和接口的混合。
  2. 抽象类类似于接口,因此它们不能被实例化。
  3. 抽象类中的所有方法都像类中的普通方法,除非它们前面有 abstract 关键字,如果是这种情况,那么它们将被视为接口中的普通方法,不需要具有代码主体,而且可以由 extends 抽象类的子类去Override。
  4. 抽象类和接口之间一个非常重要的区别是,一个类只能 extends 一个抽象类,但可以implements 多个接口。

3.Packages

Packages是一个组织类和接口的命名空间。
命名惯例:Packages name以网站地址开始(倒过来)
要使用来自不同包的类,请使用以下语法:

package_name.classname.subclassname a = new package_name.classname.subclassname();

为了使代码简洁,可以使用import

import package_name.classname.subclassname;
  • import class:

cs61b week3 -- Java libraries and packages_第3张图片

  • import static member:

cs61b week3 -- Java libraries and packages_第4张图片

Wildcard import * 通配符引用:最好不要使用通配符引用,可能会导致编译错误!

你可能感兴趣的:(javalibrary)