BerkeleyCS61B学习笔记-1
这是⼀个新的专栏,记录我⾃学Berkeley CS 61B的笔记,作业等等。CS 61B作为CS⼊门的神课,会涉及到⾯向对象编程java和数据结构两⽅⾯的知识,笔者将会记录课程的关键知识,希望对你会有所帮助。
---------------------------这是分割线---------------------------
Lecture1 Course overview, Using objects
⽂章⽬录
Goals of CS 61B
1. Learning efficient data structures and algorithms
2. Designing and writing large programs
3. Understanding and designing data abstraction and interfaces
4. Learning java
Object Oriented Programming 概述
Object: A repository of data
Class: Type of object
Method: A class may inherit properties from a more general class
eg: ShoppingList inherits from List the property of storing a sequence of items.
Polymorphism: One method works on several classes, even if the classes need different implementations
eg: “addItem” method to every kind of list, although adding item to a shopping list is different from a shopping cart. Objected-Oriented: Each object knows its class and methods
java String Object
Java在声明⼀个Object(如String)的时候,会构建⼀个Variable,这个Variable实际上有点类似于C++的指针,或者叫reference,他是会指向⼀个String Object,但是他本⾝并不是⼀个String Object,⽽只是⼀个指向String的Variable。
例如:
String myString;
myString =new String();
这⾥的new String()实际上就是构建了⼀个空的String Object,赋值的过程就是将myString指向了这个Object
如果没有第⼆⾏的话,myString就是⼀个null pointer,也就是指向nothing。
All “null” pointer don’t point to anything, they all point to the same “Nothing”.
如图:variable怎么记
再例如:
String s =new String();
s ="Yow!"
实际上,在进⾏s = “Yow!” 的操作的时候,java不会改变刚才那个空Object的结果,实际上,Java做的是重新⽣成了⼀个Object,这个Object的内容是“Yow!”,然后将s重新赋值到这个新的Object上。
如图:
再来⼏个例⼦:
String s =new String();
System.out.println(System.identityHashCode(s));
s ="Yow!";
System.out.println(System.identityHashCode(s));
String s2 = s;
System.out.println(System.identityHashCode(s2));
String s3 ="Yow!";
System.out.println(System.identityHashCode(s3));
String s4 =new String(s);
System.out.println(System.identityHashCode(s4));
把这⼏个的地址输出,得到
789451787
1950409828
1950409828
1950409828
1229416514
我们可以发现对于s2 s3的⽤法,都指向了原来的s,只有s4的⽤法才是构建了⼀个新的Object,可以说是⾮常节省内存了。⽤⽰意图来表⽰就是这样:
这种⽅式还有另外⼀个好处,就是当s和s2同时指向同样⼀个Object的时候,s的改变仅仅就是s指向了另外⼀个Object,对s2毫⽆影响。换句话说,⼀个String Variable,要是想改变这个Variable所指代的String,只能是构建⼀个新的String,String is immutable。其实java的⼤部分object都是可以改变的,只有String不⾏。我理解可能是因为String⽤的太多了,这样弄会更⾼效。
另外,当没有任何Variable指向某个Object的时候,java会有⼀个garbage collector,回收掉这部分的内存。
再介绍⼏个对string object的常⽤method
String s ="Yow!";
System.out.println(s);
String s2 = s.toUpperCase()+s.concat("!!");
System.out.println(s2);
//String s6 = s*2;(不能这么写,会报compiler error)
输出:
Yow!
YOW!Yow
java I/O Classes and Objects
说到java IO,我们⽤到的Class是System,System Class下⾯会有专门⽤于很多⽤户交互的Objects
同样的,System.in也是⼀个Variable,指向了⼀个InputStream Object,但是input⽐较复杂了,因为output是有啥输出啥就可以了,但是input你必须要等⽤户敲完回车,这才算是输⼊完成了,然后再去处理这⼀整⾏的东西,于是就⽤到了readLine,readLine是基于BufferReader的,BufferReader⼜是基于InputStreamReader,InputStreamReader⼜是基于InputStream,也就是前⾯说的System.in。(欲知详情,要看java online API)
InputStream:读取原始数据,应该是有点类似于电信号
InputStreamReader:把原始数据转化为characters(⽤的Unicode,2 bytes long)
BufferReader:把前⾯读的东西组合成⼀⾏text
这样的好处就是我们如果想改掉某些功能(⽐如我们要换成⾮键盘输⼊,也是⾮常容易就可以换的)
例⼦:(函数功能:输⼊⼀⾏输出⼀⾏)
import java.io.*;
//最基础的库是java.lang,这个不⽤import,其余的如果想⽤都是需要import的
class SimpleIO{
public static void main(String[]arg)throws Exception{
//整个函数会从这个main开始运⾏
//上⾯这⼀⾏看不懂⽼师说,以后会讲hhhhh
BufferedReader keybd =new BufferedReader(new InputStreamReader(System.in));
System.out.adLine());
}
}
ps,最后⼀定要存成SimpleIO.java的⽂件,再编译
第⼀次作业:Lab1
作业的要求在课程链接都可以到
作业代码都上传到了。
第⼀次作业很简单,只需要修改代码中的三个bug
第⼀个是没加分号
第⼆个是少了⼀半括号
前两个bug都是compiler error
第三个是⼀个index写错了
第三个是⼀个runtime error
还有⼀个作业是学习Emacs的使⽤,这个是⼀个⽂本编辑器,我已经有⾃⼰⽤的顺⼿的编辑器了就没有管他~