1 Class
Data Types
Primitive Data Types
C++(ILP32:int long pointer)
Type | Storage(bits) |
---|---|
char | 8 |
short | 16 |
int | 32 |
long | 32 |
float | 32 |
long long | 64 |
double | 64 |
Java
Type | Storage(bits) | Min Value | Max Value |
---|---|---|---|
boolean | - | - | - |
byte | 8 | -128 | 127 |
short | 16 | ||
char | 16 | 0 | |
int | 32 | ||
long | 64 | ||
float | 32 | Approximately-3.4e+38 with 7 significant digits | Approximately3.4e+38 with 7 significant digits |
double | 64 | Approximately-1.7e+308 with 15 significant digits | Approximately-1.7e+308 with 15 significant digits |
Operator precedence
单算移关与,异或逻条赋
- 单表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(--),取地址(&),取值(*)
- 算表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-)
- 移表示按位左移(<<)和位右移(>>)
- 关表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=)
- 与表示按位与(&)
- 异表示按位异或(^)
- 或表示按位或(|)
- 逻表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||)
- 条表示条件运算符(? :)
- 赋表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=, |=,!=)
Immutability: final
- Primitive types ensure immutability
- Declaring a reference as final does not make object immutable
Initialization
- Data Field
- null for a reference type
- 0 for a numeric type
- false for a boolean type
- '\u0000' for a char type
- no default value to a local variable
Pass by value
- For a parameter of a primitive type, the actual value is passed
- For a parameter of an array type, the reference value is passed
Object
Function | Interpretion |
---|---|
boolean equals(Object w) | 判断两个对象变量是否指向同一个对象 |
String toString() | Returns a string representation of the object. |
Class<?>getClass() | Returns the runtime class of this Object. |
protected Object clone() | Creates and returns a copy of this object. |
int hashCode() |
Autoboxing(auto-unboxing)
Implicit conversions between wrapper/primitives.
public class BasicArrayList {
public static void main(String[] args) {
ArrayList<Integer> L = new ArrayList<Integer>();
L.add(5);
L.add(6);
int first = L.get(0);
}
}
Arrays are never autoboxed/unboxed, e.g. an Integer[] cannot be used in place of an int[] (or vice versa).
Object Comparison
public interface Comparable<T> {
public int compareTo(T obj);
}
public interface Comparator<T> {
int compare(T o1, T o2);
}
public class Person implements Comparable<Person> {
private String mSurname;
private int mAge;
public int compareTo(Person p) {
return mSurname.compareTo(p.mSurname);
}
}
public class AgeComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
return (p1.mAge-p2.mAge);
}
}
ArrayList<Person> plist = ...;
// 法1: sorts by surname
Collections.sort(plist);
// 法2: sorts by age
// Collections.sort(plist, new AgeComparator());
Designing Classes
Constructor
- Constructors must have the same name as the class itself
- A constructor with no parameters is referred to as a no-arg constructor(default: no-arg constructor with an empty body)
- Constructors do not have a return type(Not even void)
POJO: plain old java object, sometimes called an Entity
DTO: data transfer object
Visibility Modifiers
Class level: Only public and (default)
Member level:
Modifiers | Description |
---|---|
public | The member is visible to any class in any package |
protected | default + inheritance |
(default) | By any class in the same package (aka package private) |
private | Only by the declaring class |
//package a;
public class Vehicle {
protected void drive() {System.out.print("Drive !");}
void stop() {System.out.print("Stop !");}
}
// package b
// import a.Vehicle;
public class Car extends Vehicle {
private void test(Vehicle obj) {
obj.drive();// invisible to different package
drive(); // compile ok
stop(); // invisible to different package
}
}
Class Import
- The normal import declaration imports classes from packages, allowing them to be used without package qualification
- The static import declaration imports static members from classes, allowing them to be used without class qualification
- Common Scenario: local copies of constants
import static java.lang.Math.cos;
double r = cos(PI * theta);
Order of Initialization
1.Staic members is to be initialized in the loading of the class,属于类的数据(C++全局)
2.When a new object is create,顺序:
- Allocate enough storage for an object on the heap.
- Setting all the primitives in the object to their default values.(Any initializations that occur at the point of field definition are executed.)
- Constructors are executed.
Cleanup:finalize()
When the garbage collector is ready to release the storage used for your object,it will first call its finalize() to clean up temporary files, close sockets/connections, etc.
- Blocking: pause the program when collecting garbage
- Incremental: collect in multiple phases and let the program run in the gaps
- Concurrent: runs concurrently with the program
Compare with C++:
void UseRawPointer()
{
MyClass *mc = new MyClass();
delete mc;//manually deleted
}// or auto-deleted when out of scope
Problems:
We either forget to delete (memory leak) or we delete multiple times (crash)
Inheritance & Polymorphism
Inheritance
private、static method cannot be overriden
If a static method defined in the superclass is redefined in a subclass, the method defined in the superclass is hidden
// 区分instance 和 static method
public class BaseClass
{
public void objectAction();
public static void classAction()
{
System.out.println("classAction in BaseClass.");
}
}
public class DerivedClass extends BaseClass
{
public void objectAction()
{
this.classAction(); // OK
}
public static void classAction()
{
//super.objectAction(); // Not OK
BaseClass.baseAction();// OK
}
}
public class Demo
{
public static void main(String[] args)
{
DerivedClass derivedObject = new DerivedClass();
BaseClass baseObjectAlias = derivedObject;
baseObjectAlias.classAction();//classAction in BaseClass. Hide but not override
}
Overriding
- Have the same signature
- Are in different classes related by inheritance
Overloading
- Have the same name, but different parameter lists
- Can be either
- In the same class
- In different classes related by inheritance
Eg:
System.out.println(true?Integer.valueOf(1):Double.valueOf(2))
//输出1.0,因为java是编译语言不是解释语言,编译器看到函数调用不会立即执行
//而是根据double确定println overload为double类型
Polymorphism
The compiler chooses the most specific matching method signature from the static type of the invoking class
- Static Type: type specified at declaration
- Dynamic Type: type specified at instantiation(the object being pointed at)
- dynamic method selection: if dynamic type overides the method, its method is used instead.
Casting Problem:
- Compiler allows method calls based on compile-time(static) type of variable
- (联想集合)To move from a wider type to a narrower type, must use casting
Abstract Classes & Interfaces
One can implement multiple interfaces, but extend only one class:
multiple interface inheritance, but single body inheritance.
Interfaces
Interfaces may combine a mix of abstract and default methods.
- Unless you use the keyword default, a method will be abstract
- Unless you specify an access modifier, a method will be public(All method declarations in an interface, including default methods, are implicitly public, so you can omit the public modifier.)
- Can provide variables, but they are public static final
public interface Module {
double gravity = 6.67e-11;
void update(double dt);
public default void doSomething() {
System.out.println("Do something");
}
}
// Interface as a data type
Module[] instances = new Module[1];
instances[0] = new module{
void update(double dt){}
}
Abstract Class
Abstract method(only a signature without implementation)
Abstract class as a data type
GeometricObject[] objects = new GeometricObject[2];
Anonymous Class
R = map(new IntUnaryFunction() {
public int apply(int x) {
return Math.abs(x);
}
}, some list);
//Equals to
class Anonymous implements IntUnaryFunction {
public int apply(int x) {
return Math.abs(x);
}
}
R = map(new Anonymous(), some list);
Lambda Expression
- A comma-separated list of formal parameters enclosed in parentheses(Optional type declaration)
- The arrow token, ->
- A body, which consists of a single expression or a statement block.
//一个参数时()可省略
(param1, param2, …, paramN) -> { statements }
(param1, param2, …, paramN) -> expression
//相当于:(param1, param2, …, paramN) ->{ return expression; }
// Anonymous 可以改写
R = map((int x) -> Math.abs(x), some list);
// or even better, Method Reference
R = map(Math::abs, some list);
Method Reference
- Reference to a static method
- ContainingClass::staticMethodName
- Reference to an instance method of a particular object
- containingObject::instanceMethodName
- Reference to an instance method of an arbitrary object of a particular type
- String::concat
- Reference to a constructor
- HashSet::new
Other Classes
java.util.Scanner
Class Scanner implements Iterator<String>, Closeable{
Scanner(InputStream source);
// move forward one byte/int, return the one scanned from the input
// hasnextByte()/nextByte()
// hasnextShort()/nextShort()
// hasnextInt()/nextInt()
// hasnextLine()/nextLine(), returns the rest of the current line, excluding any line separator at the end
}
Scanner input = new Scanner(System.in);
int value = input.nextInt();
java.util.Arrays
get length: (Object you create).length
/***Creation****/
int[] A = new int[4]; // A points to array of 4 0s.
int[] B; // Same thing, but in two steps.
B = new int[4];
int[] C = new int[] { 1, 2, 3, 4 }// Array with explicit initial values.
int[] D = { 1, 2, 3, 4 } // Shorthand for the above
/***Method******/
public static <T> List<T> asList(T... a)//Returns a fixed-size list backed by the specified array.
public static <T> void sort(T[] a,
int fromIndex,
int toIndex,
Comparator<? super T> c)
public static boolean equals(Object[] a,
Object[] a2)//Returns true if the two specified arrays of Objects are equal to one another.
public static void fill(Object[] a,
int fromIndex,
int toIndex,
Object val)
java.lang.String
//Can't modify
Class String{
char charAt(int index);
String concat(String s1); // Returns a new string that concatenates this string with string s1.
static String format(String format, Object... args);
String formatted(Object... args);
boolean isEmpty();
int indexOf(String str);
int length();
String substring(int beginIndex, int endIndex);
String toUpperCase();//Returns a new string with all letters in uppercase
String toLowerCase();
String trim();//Returns a string whose value is this string, with any leading and trailing whitespace removed.
}
// Can modify
Class StringBuilder implements CharSequence{
StringBuilder(int capacity);
StringBuilder(CharSequence seq);//Constructs a string builder that contains the same characters as the specified CharSequence
StringBuilder(String str);//Constructs a string builder initialized to the contents of the specified string
StringBuilder append(String s);// 会变
StringBuilder append(char c);// 会变
StringBuilder append(CharSequence s);// 会变
char charAt(int index);
int length();
void setCharAt(int index, char ch);
StringBuilder reverse();
}
int age = 12;
String formattedString = "Your age is %d".formatted(age);
String formattedString = String.format("Your age is %d",age);
// ParseInt
String ageStr = "13";
age = Integer.parseInt(ageStr);