1. 程式人生 > >第6天類的繼承

第6天類的繼承

1.的繼承

語法

class 子類 extends 父類{

子類的屬性

子類的方法

}

繼承的特點:子類會把父類所有的屬性和方法繼承下來

程式碼

/**

 * 父類

*/

class Teacher{

String name;

int age;

public void sleep(){

System.out.println("老師在睡覺");

  }

 } 

/**

 * 子類的定義

 */

//class 子類 extends 父類{

class JavaTeacher extends Teacher{

public void teachJava(){

System.out.println(name+"老師正在教java"+"   年齡:"+age);

  }

}

 class PHPTeacher extends Teacher{

 public void teachPHP(){

System.out.println(name+"老師在教PHP"+"   年齡:"+age);

  }

}

class ExtendsDemo2{

public static void main(String[] args){

JavaTeacher  jt = new JavaTeacher();

jt.name = "張三";

jt.age = 30;

jt.teachJava();

 

PHPTeacher pt = new PHPTeacher();

pt.name = "李四";

pt.age = 40;

pt.teachPHP();

  }

 }

 

2.繼承 記憶體

 

3.Super的特點

1.子類例項化的過程中父類的構造器先被呼叫,然後再呼叫子類的構造器。

2.子類的被呼叫的時候父類的預設構造器就會被呼叫(父類如果存在著有引數的構造器,一定要把預設構造器顯式的定義出來)。

3.子類在呼叫父類的有引數的構造器的時候使用super(引數列表…),這時父類的預設的構造器就不會再被呼叫了。

程式碼1:

class Teacher{
String name;
int age;
//預設的構造器
public Teacher(){
System.out.println("父類預設構造器被呼叫");
}
//帶引數的構造器,如果預設的構造器沒顯示出來,會被帶引數的構造器覆蓋掉
public Teacher(String name){
this.name = name;
System.out.println("父類有引數構造器被呼叫");
}

public void sleep(){
System.out.println("老師正在睡覺");
}
}

 

/**
*子類繼承父類語法:class 子類 extends 父類
*/
class JavaTeacher extends Teacher{
public JavaTeacher(String name){
/**在子類的構造器中隱藏了呼叫super,這個super是無引數的
*無論子類的構造器帶不帶引數,都會呼叫父類的構造器
*/
//super();
//呼叫父類有引數的構造器,那麼父類預設的構造器不會被呼叫,會被覆蓋
super(name);//super一定要在第一行
this.name = name;
System.out.println("子類的預設構造器被呼叫");
}

public void teachJava(){
System.out.println(name+"老師正在教java");
  }
}

class ExtendsDemo4{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher("張三");
 }
}

 

程式碼2:

class Teacher{
String name = "任亮";
int age;
public void sleep(){
System.out.println("老師在睡覺");
}
}

/**
*子類繼承父類語法:class 子類 extends 父類
*/
class JavaTeacher extends Teacher{
String name = "亮哥";
public void teachJava(){
//預設情況下單獨的使用物件的熟悉時都隱藏了this.
System.out.println(this.name+"老師正在教java");
//加上super.,呼叫的是父類的屬性
System.out.println(super.name+"老師正在教java");
}

/**父類和子類有同名的方法,在呼叫的時候會輸出子類的方法
*如果要區分,在子類中使用this.sleep();super.sleep()
*/
public void sleep(){
System.out.println("Java老師在睡覺");

}
}

 

class ExtendsDemo5{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher();
jt.teachJava();
jt.sleep();
}
}

 

4.final:

1.修飾在屬性上

class User{

//fianl修飾在屬性上,屬性的值不能再改變
final int username;

int password;
//fianl修飾在屬性上,屬性的值不能再改變
public static final float PI = 3.14f;


}

class FinalDemo1{
public static void main(String[] args){
User e = new User();
e.username = 123;//已經無法改變值
User.PI = 6.28f;//已經無法改變值
}
}

 

2.修飾在方法上

程式碼1:

 

class User{
int username;
int password;
//final修飾在方法上,子類繼承父類無法對final方法進行重寫
public final void login(int username,int password){
if(username == 123&&password == 123){
System.out.println("登陸成功");
}
}
}

 

class Emp extends User{
int empNo;
//子類對父類方法進行重寫
public void login(int username,int password){
System.out.println("登陸成功");
}
}
class FinalDemo{
public static void main(String[] args){
Emp e = new Emp();
e.login(1,1);
}
}

3.修飾在類上

//使用final來修飾的類是不可以被繼承的
final class User{
}

class Emp extends User{
int empNo;
}
class FinalDemo2{
public static void main(String[] args){
Emp e = new Emp();
}
}