面向對象三大特性:
5.1繼承(extends)--
1.生成子類的過程
2.Super調用構造函數
class People{
String name;
int age;
People(){
System.out.println("pleple hava no ");
}
People(String name,int age){
this.name=name;
this.age=age;
System.out.println("there have");
}
void eat(){
System.out.println("eat");
}
}
class Student extends People{
int grade;
//在子類的構造函數當中,必須調用父類的構造函數,因爲子類繼承了父類的變量、方法,需使用super調用父類
Student(){
super();//調用父類中的相對應構造函數,如果不寫,編譯器會自動添加
System.out.println("student have no");
}
Student(String name,int age,int grade){
super(name,age);
this.grade=grade;
}
}
class TestS{
public static void main(String args[]){
Student student=new Student("zhangsan",10,3);
}
}
注意:super調用父類的構造函數時,必須放在第一位。
5.1.2 複寫(override)
class People{
String name;
int age;
void introduce(){
System.out.println("my name is :"+name+",my age is:"+age);
}
}
//複寫(override)也被稱爲覆蓋或者重寫
//1.在具有父子關係的兩個類中
//2.父類和子類當中各有一個函數,這兩個函數的定義(返回值類型、函數名、參數值)相同
class Student extends People{
String address;
void introduce(){
super.introduce();
System.out.println("my home in"+address);
}
}
5.1.3對象轉型
1.對象的向上轉型
//一個引用能夠調用哪些成員(變量和函數),取決於這個引用的類型
//一個引用調用的方法取決於引用所指向的對象
class TestS{
public static void main(String args[]){
Student s=new Student();
Person p=s;//向上轉型
或者使用這種方式:Person p=new Student();
p.name="zhangsan";
p.age=20;
}
}
2.對象向下轉型
或者Person p=new Student();
Student s=(Student)p;
3.抽象類(用作父類、基類)與抽象函數:
abstract class PersonA{//一個類中有抽象函數,那麼類也必須定義爲抽象類
String name;
int age;
void introduce() {
System.out.println("my name is "+name+",age is:"+age);
}
abstract void eat();//抽象函數
}
class TestPa{
public static void main(String args[]){
PersonA p=new Chinese();//向上轉型爲PersonA父類
p.eat();//調用方法,此時這個方法不是抽象函數
}
}
class Chinese extends PersonA{
void eat(){
System.out.println("use it");//通過override對抽象函數複寫,使得子類可以生成對象
}
}
問題:抽象類可以有構造函數嗎?
可以有,因爲子類會自動調用super();
abstract class PersonA{
PersonA(){
System.out.println("PersonA fun");//構造函數
}
String name;
int age;
void introduce() {
System.out.println("my name is "+name+",age is:"+age);
}
abstract void eat();
}
class Chinese extends PersonA{
Chinese(){//構造函數
super();//默認調用
System.out.println("chinese fun");
}
void eat(){
System.out.println("use it");
}
}
抽象函數默認爲public