1、繼承
//繼承、instanceof的用法、對象類型的強制類型轉換
public class ExtendsDemo {
public static void main(String[] args){
Student s = new Student("張三",23);
Teacher t = new Teacher("李四",35);
Print(s);
Print(t);
}
private static void Print(Person p){
if(p instanceof Student){ //instanceof 關鍵字用來判斷一個實例是否是某一類型,是返回true,否返回false。
Student s = (Student) p; //這裏必須使用類型轉換,Person()類中沒有 learn()方法,強制轉型爲 Student類型,才能調用learn()
System.out.print(s.name+" "+s.age+" "+s.eat()+" ");
s.learn();
}
else if(p instanceof Teacher){
Teacher t = (Teacher) p;
System.out.print(t.name+" "+t.age+" "+t.eat()+" ");
t.teach();
}
else{ System.out.println("error");}
}
}
class Person{
public String name;
public int age;
public String eat(){
return "吃飯";
}
}
class Student extends Person{ //extends 關鍵字表示繼承關係
Student(String name,int age){
this.name = name;
this.age = age;
}
public void learn(){
System.out.println("學習");
}
}
class Teacher extends Person{
Teacher(String name,int age){
this.name = name;
this.age = age;
}
public void teach(){
System.out.println("教課");
}
}
學生跟老師都有姓名和年齡這兩個屬性,都有吃東西這個行爲。Student() 類和 Teacher() 類再使用 extends 關鍵字繼承 Person() 類的成員變量和成員函數。
2、重載
3、函數覆蓋/重寫(OverRide)
//輸出結果爲“吃蘋果 吃西瓜”
public class OverRideDemo{
public static void main(String[] args){
Student s = new Student();
s.eat();
s.eat_2();
}
}
class Person{
public void eat(){
System.out.println("吃西瓜");
}
}
class Student extends Person{
public void eat(){
System.out.println("吃蘋果");
}
public void eat_2(){
super.eat(); //使用 super.函數名() 來調用父類的函數
}
}
4、子類的實例化過程
(1)靜態代碼塊隨着類的加載最先初始化。
Person p = new Person();
/**
因爲new用到了Person.class 所以會先找到Person.class 文件並加載到內存中。
執行該類中的static代碼塊,如果有的話,給Person.class 類進行初始化。
在堆內存中開闢空間,分配內存地址。
在堆內存中建立對象的特有屬性,並進行默認初始化。
對屬性進行顯示初始化。
對對象進行構造代碼塊初始化。
對對象進行對應的構造函數初始化。
將內存地址賦給棧內存中的p 變量。
*/
public class OverRideDemo{
public static void main(String[] args){
Student s = new Student();
}
}
class Person{
Person(){
System.out.println("父類初始化");
}
}
class Student extends Person{
Student(){
System.out.println("子類初始化");
}
}
輸出結果爲:這表示子類初始化時,會先初始化父類。
public class OverRideDemo{
public static void main(String[] args){
Student s = new Student(21);
}
}
class Person{
Person(int age){
System.out.println("父類初始化 "+age);
}
}
class Student extends Person{
Student(int age){
super(age); //父類中無空參構造函數時,要指定使用哪個構造函數來初始化父類。
System.out.println("子類初始化");
}
}
輸出結果:靜態代碼塊隨着類的加載最先初始化