Java-OOP_Extends

继承

对象们 - 有所同 ,有所不同

  • 羊 - 吃草 - 移动 - 睡觉
  • 老虎 - 吃肉 - 移动 - 睡觉
  • 将类进行一个分类

语法格式:

  • 关键字:extends
  • 格式: public class 子类 extends 父类
  • 父类 SuperClass

权限范围:

学生类 (大学生类 中学生类 小学生类)

  • 子类继承到了父类的哪些东西?
    所有

  • 子类以及子类对象可以调用到继承的哪些东西?

访问权限修饰符 :

                范围
- private      类的{}中  
- protected     
- public       整个项目中 
- 缺省的  不写    

项目的结构:

​ 项目: public
​ 包:缺省 和 protected
​ 文件:
​ 类: private
​ 不同包:
​ 文件:
​ 子类:protected

Code Test

同包下

package oop.zyf0730.extendsV1;
/**
 * 父类  Student
 */
public class Student {
   public  String name;
   protected int age;
             int id;
   private  int score;


}

package oop.zyf0730.extendsV1;
// UNStudent 在同包继承了Student
// 只有 私有的 不能调用
public class UNStudent extends Student{

    public void printUnStuInfo(){
        System.out.println("姓名:"+name);
        System.out.println("年齡:"+age);
        System.out.println("ID"+id);
        //System.out.println("學分:"+score);
    }

}
package oop.zyf0730.extendsV1;

/**
 * StuManage 属于 与父类以及子类在同一个包中
 * 子类以及父类的对象只有私有的不能访问 
 */
public class StuManage {

    public static void main(String[] args) {
        UNStudent unstu = new UNStudent();
        unstu.name="LZW";
        unstu.age=20;
        unstu.id=1;
        // unstu.score=10;// 'score' 在 'oop.zyf0730.extendsV1.Student' 中具有 private 访问权限
        unstu.printUnStuInfo();
    }

}



不同包:

package oop.zyf0730.extendsV2;
import oop.zyf0730.extendsV1.Student;

/**
 * 不同包中的子类 
 * MidStudent 继承了 不同包中的父类
 * 公共的与受保护的可以调用
 * 缺省与私有的不行
 */
public class MidStudent extends oop.zyf0730.extendsV1.Student{

    public void printUnStuInfo(){
        System.out.println("姓名:"+name);
        System.out.println("年齡:"+age);
        System.out.println("ID"+id);
       System.out.println("學分:"+score);
    }
}

package oop.zyf0730.extendsV2;
/**
 * MidStuManage 属于 与父类以及子类在不同包中
 * 子类以及子类的对象 只能调用public 修饰的 
 */
public class MidStuManage {

    public static void main(String[] args) {
        MidStudent mdstu = new MidStudent();
        mdstu.name="LZW";

    }
}

任务:

来总结可以访问的范围权限

方法重写:

// 方法实现:接口中 -- 抽象方法在类重写
接口中所有的方法都需要重写实现

继承中的方法重写:可以选择性重写

  • 两个类必须有继承关系
  • 子类中可以重写父类的方法
  • 格式: 一般要求 除方法体之外与父类方法一致
  • 重写之后,子类以及子类对象优先调用重写之后的方法
  • 在子类中,super 可以指代父类 调用方法属性
// 重写父类方法
    @Override
    public int test(String name) {
        super.test(name);// 保留父类方法原本的代码

        System.out.println("子类重写的方法");

        return 100;
    }


方法重载:

  • 一个类中,可以写多个同名的方法
  • 格式要求,参数列表必须不一致
  • 前提是已经实现了方法重载 - 访问修饰符 返回值类型没有要求,方法之间可以改

子类对象可以向父类类型转型

大学生类 的对象

  • 某一个大学生 类型有哪些?
  • 首先是大学类
  • 然后是学生类
  • 然后是人类

A a = new A();                  x  A类型
a 是一个子类对象  大学生类
B b = a;// 前提:  
变成了一个、父类对象 学生类
        
A a1 = (A)b;// 强制转型 -- 向下转型 
// 前提是 原本的类型就是 当前需要向下转的类型 


我是学生! 对方: 属于学生类

// 子类对象转型父类类型之后还是调用自己重写的方法
// 子类对象转型父类类型之后不能调用自己独有的方法
- 但是可以再向下转型来调用

package oop.zyf0730.extendsV1;

import oop.zyf0730.extendsV2.MidStudent;

/**
 * StuManage 属于 与父类以及子类在同一个包中
 * 子类以及父类的对象只有私有的不能访问
 */
public class StuManage {

    public static void main(String[] args) {
        UNStudent unstu = new UNStudent();
        unstu.name="LZW";
        unstu.age=20;
        unstu.id=1;
       // unstu.score=10;// 'score' 在 'oop.zyf0730.extendsV1.Student' 中具有 private 访问权限
//        unstu.printUnStuInfo();



        MidStudent mdstu = new MidStudent();
        mdstu.name="LZW";
        mdstu.age=20;
        //mdstu.id=1;

        unstu.printUnStuInfo();
        unstu.test("LZW");
        mdstu.test("LZW2");

        UNStudent unstuX= new UNStudent(); // 1- 2-1
        Student stuX=unstuX;// 向上转型
        stuX.test("LZW");// 子类对象转型父类类型之后还是调用自己重写的方法

        // 正确的向下转型
        UNStudent unstuX1 = (UNStudent) stuX;
        unstuX1.printUnStuInfo();


        // 错误的向下转型 stu = new Student(); 属于父类类型的对象
        Student stu = new Student();// 父类  // 2 -1
        UNStudent unstu1 = (UNStudent)stu;// ClassCastException
        unstu1.printUnStuInfo();
    }

}
posted @ 2022-01-07 16:07  30%privatetoobject  阅读(28)  评论(0)    收藏  举报