## 大数值
import java.math.*;
import java.util.*;
BigInteger c = BigInteger.valueOf(100).divide(BigInteger.valueOf(10)).multiply...add...substract...;
# 第5章 继承
## 5.1 类、超类和子类
### 5.1.1 继承层次
### 5.1.2 多态
可以将子类对象赋给超类变量
### 5.1.3 动态绑定
执行f函数:
Step1. 编译器列出所有函数名为f的本类函数和超类public函数
Step2. 编译器查看函数参数个数、参数类型,选择一致的进行调用
PS:1. 方法的名字和参数列表为方法的签名(而不包括返回类型);与超类方法签名一致的子类方法会对其进行覆盖。
2. 如果是private或static或final 方法,编译器可以准确知道该调用哪个,因此为静态绑定;否则为动态绑定,运行时采取选择。
3. 虚拟机会预先为每个类创建一个坊发表,以减少时间开销。
### 5.1.4 阻止继承:final类和方法
### 5.1.5 强制类型转换
1. 只能在继承层次内进行类型转换
2. 在将超类转换成子类之前应使用instanceof进行检查
if(staff[i] instanceof Manager){
boss = (Manager) staff[i];
}
PS:如前所述,将子类引用赋给超类变量,编译器是允许的;但将一个超类引用赋给子类变量,必须进行类型转换。
### 5.1.6 抽象类
利用关键字abstract
包含一个或多个抽象类方法的类本身必须声明为抽象类(若子类仍然不实现该方法,则子类也应声明为抽象类); 不包含抽象方法也可以声明为抽象类;抽象类不能被实例化
abstract class Person{
public abstract String getDescription();
...
}
class Student extends Person{
private String major;
public Student(String n, String m){
super(n);
major = m;
}
public String getDescription(){
return "a student majoring in "+major;
}
}
Person[] people = new Person[2];
people[0] = new Employee(...);
people[1] = new Student(...);
for(Person p: people)
System.out.println(p.getName() + ", " + plgetDescription());
## 5.2 Object: 所有类的超类
1. 可以使用Object类的变量引用任何类型的对象(包括数组因为在java中,只有基本类型(Primitive types,即数值、字符、布尔型)不是对象):
Object obj = new Employee("Harry Potter", 35000);
Employee e = (Eployee) obj;
2. Object类中的方法:
(1) equals 对引用类型 看是否为同一对象,常用于判断是否为null
(2) getClass 返回对象所属的类
![](https://leanote.com/api/file/getImage?fileId=5ab6fc11ab6441355d000291)
package testCode;
import java.io.*;
class Person{
private
String name;
String gender;
int age;
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
}
class Student extends Person{
private
String studentID;
public Student(String name, String gender, int age, String studentID) {
super(name, gender, age);
this.studentID = studentID;
}
}
class Teacher extends Person{
public Teacher(String name, String gender, int age) {
super(name, gender, age);
}
}
public class Test0{
public static void main(String[] args) throws IOException {
String str = null;
Person pervar = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 绑定到控制台的字符流br
while((str=br.readLine())!=null) {
System.out.println(str);
String arr[] = str.split(" ");
System.out.println(arr.length);
if(arr.length==3) {
pervar = new Teacher(arr[0], arr[1], Integer.parseInt(arr[2]));
}
else if(arr.length==4) {
pervar = new Student(arr[0], arr[1], Integer.parseInt(arr[2]), arr[3]);
}
System.out.println(pervar.getClass());
}
}
}
## 5.3 泛型数组列表ArrayList
import java.util.*; // get set add remove
ArrayList xlist = new ArrayList<>();
xlist.add(x1);
xlist.add(x2);
xlist.add(1, x3); // 1位置后面的元素会后移
xlist.set(0, x2);
xlist.get(0);
xlist.remove(2); // 2位置后面的元素会前移
X[] xarr = new X[xlist.size()];
xlist.toArray(xarr);
for(X tmpx : xlist)
do something with tmpx;
//等价于:
for(int i=0; i
X tmpx = xlist.get(i);
do something with tmpx;
}
// Integer类:
int intValue()
static String toString(int i)
static String toString(int i, int radix)
static int parseInt(String s)
static int parseInt(String s, int radix)
## 5.7 反射
3种方法获得class类:
1. Object类: .getClass() 返回 Class类对象
2. 任意类型: .class 返回对应的Class类对象 (如int.class, Date.class)
3. Class类: static函数 Class.forName(className) 返回类名为classname的Class对象
Class类: .getName() 返回该类的类名
Eployee e;
Class cl = e.getClass();
System.out.pringln(cl.getName());
Class clCopy = class.forName(e.getClass().getName());