第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();
}
}