繼承
- 1、提高了代碼的複用性,簡化了代碼
- 2、讓類與類之間產生繼承關係,纔有了後面的多態特性的存在
//父類,基類,超類
class Person5{
String name;
int age;
}
//子類
class Student8 extends Person5{ //繼承用 extends 父類名
void study(){
System.out.println("學習");
}
}
//子類
class Teacher extends Person5{
void teach(){
System.out.println("教書");
}
}
public class test_extends {
public static void main(String[] args){
Student8 S = new Student8();
S.study();
System.out.println(S.age);
}
}
- 子類擁有父類的成員,子類不能擁有父類中被private修飾後的成員
- java多層繼承,在多層繼承中最下層的子類擁有整個繼承體系的成員,最上層的父類裏面定義所有子類的共性描述
- java中不支持多繼承,只支持單繼承。因爲多繼承存在安全隱患,當多個父類定義了相同的成員,子類對象不確定運行哪一個
// 父類 動物
class Animal{
String buru = "哺乳";
}
// 第一級子類 貓科
class MaoKe extends Animal{
String color;
void eat(){
System.out.println("吃");
}
}
// 第二級子類貓
class Cat1 extends MaoKe{
void CatchMouse(){
System.out.println("抓老鼠");
}
}
//第二級子類獵豹
class Leopaed extends MaoKe{
void run(){
System.out.println("奔跑");
}
}
public class test_extends1 {
public static void main(String[] args){
Cat1 c = new Cat1();
System.out.println(c.buru); //第一級父類的成員變量
System.out.println(c.color); //第二級父類的成員變量
c.eat();
}
}
成員:成員變量、函數、構造函數
- this 代表當前對象的引用 this. 變量 首先在本類中找所需要的這個變量,如果沒有找到再從父類中找
- super 用於訪問當前對象的父類成員, super . 變量 直接在父類中找所需變量
//父類
class Person7{
String name = "何藝";
}
//子類
class Student7 extends Person7{
String name = "Hey";
void show(){
System.out.println(super.name); //子類調用父類需要super
System.out.println(name);
}
}
public class test_extends2 {
public static void main(String[] args){
Student7 stu = new Student7();
stu.show();
}
}
例
class Weapen{ //武器
public String power = "我具有攻擊力哦";
public int speed = 360;
Weapen(){
System.out.println("我是父類的構造方法");
}
}
class Tank extends Weapen{ //坦克
private String dir = "左";
public void atack(){
System.out.println("我是坦克,向"+dir+"方向移動,速度"+super.speed+"攻擊力"+super.power);
}
}
public class test_extends6 {
public static void main(String[] args){
Tank t = new Tank();
t.atack();
}
}
- 當子類中出現和父類中一樣的函數時,當子類對象調用該函數,運行的是子類中的函數,如同父類中的函數被覆蓋了,這種情況就是函數的另一種特性:重寫(覆蓋)
注意: - 子類覆蓋父類時,必須保證子類權限大於等於父類,纔可以覆蓋,否則編譯出錯
- 訪問權限修飾符:public > default > private
- 成員前面沒加任何訪問權限,修飾符默認權限爲default
- 靜態的函數只能覆蓋靜態的
區分:
- 重載:只看同名的方法參數列表
- 重寫:子父類方法要一模一樣
class Animal1{
String type;
void run(){
System.out.println("跑步中");
}
}
class Dog1 extends Animal1{
void run(){
type = "小白";
System.out.println(type+"正跑過來");
}
}
public class test_extends3 {
public static void main(String[] args){
Dog1 dog = new Dog1();
dog.run();
}
}
例
class Animal2{
void show(){
System.out.println("我是父類");
}
void sleep(){
System.out.println("動物在睡覺");
}
}
class Cat2 extends Animal2{
void show(String name){
System.out.println(name);
}
void sleep(){
System.out.println("貓在睡覺");
}
}
public class test_extends5 {
public static void main(String[] args){
Cat2 cat = new Cat2();
cat.show("小貓咪");
cat.sleep();
}
}
- 有了子父類之後構造函數的特點:
- 在對子類對象進行初始化的時候,父類的構造方法也會運行,那是因爲子類的構造函數默認第一行有一條隱式語句 super()