Java后端开辟day21--面向对象进阶(二)--继承进阶

[复制链接]
发表于 2025-10-24 20:49:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

(以下内容全部来自上述课程)

1.继承

1.子类到底能继承父类中的哪些内容?


  • 构造方法(纯不能)      非私有:不能        private:不能
    比如:把构造变量看成自己,爹就是爹,儿子就是儿子,不能混着来。
  • 成员变量(纯能)                 非私有:能                           private:能
    比如:父亲有public武功直接继承给儿子;如果是private武功就是把武功锁起来给儿子,钥匙是setget方法。
  • 成员方法        (最正常)         非私有:能            private:不能
  • 注意:继承不便是能调用!!!!!!
1.误区(错的)


  • 父类私有的东西,子类就无法继承
  • 父类中非私有的成员,就被子类继承下来了。
2.内存图

栈:方法(main)
堆:new出来的成员变量
方法区:字节码文件(类)
1.成员变量为非私有(可继承也可直接利用)


2.成员变量为私有(可继承但不能直接调用)


3.成员方法的虚方法


4.成员方法继承的内存图


2.继承中:成员变量的访问特点

就近原则:谁离我近,我就用谁
  1. package a02loopextendsdemo2;
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         Zi z = new Zi();
  5.         z.ziShow();
  6.     }
  7. }
  8. class Fu {
  9.     String name = "Fu";
  10. }
  11. class Zi extends Fu {
  12.     String name = "Zi";
  13.     public void ziShow() {
  14.         String name = "ZiShow";
  15.         System.out.println(name);  //ZiShow  就近原则:局部位置
  16.         System.out.println(this.name);  //Zi  本类成员位置
  17.         System.out.println(super.name);  //Fu  super表示父类
  18.     }
  19. }
复制代码
3.继承中:成员方法的访问特点

直接调用满足就近原则:谁离我近,我就用谁
super直接调用,直接访问父类
1.方法的重写

当父类的方法不能满足子类如今的需求时,须要举行方法重写
誊写格式:
在继承体系中,子类出现了和父类中千篇同等的方法声明,我们就称子类这个方法是重写的方法。
@Override重写注解

  • @Override是放在重写后的方法上,校验子类重写时语法是否准确。
  • 加上注解后如果有赤色的波浪线,表现语法错误。
  • 发起重写方法都加@Override注解,代码安全,优雅!
2.方法重写的本质


3.方法重写注意事项和要求


  • 重写方法的名称、形参列表必须与父类中的划一。
  • 子类重写父类方法时,访问权限子类必须大于便是父类(空着不写<protected<public)
  • 子类重写父类方法时,返回值范例子类必须小于便是父类
  • 发起:重写的方法只管和父类保持划一。
  • 只有被添加到虚方法表中的方法才华被重写。
4.方法重写的实例



1.Dog
  1. package a03loopextendsdemo3;
  2. public class Dog {
  3.     public void eat(){
  4.         System.out.println("狗吃狗粮");
  5.     }
  6.     public void drink(){
  7.         System.out.println("狗喝水");
  8.     }
  9.     public void lookHome(){
  10.         System.out.println("狗看家");
  11.     }
  12. }
复制代码
2.Husky
  1. package a03loopextendsdemo3;
  2. public class Husky extends Dog {
  3.     //拆家
  4.     public void breakHome(){
  5.         System.out.println("哈士奇拆家");
  6.     }
  7. }
复制代码
3.SharPei
  1. package a03loopextendsdemo3;
  2. public class SharPei extends Dog{
  3.     @Override
  4.     public void eat(){
  5.        super.eat();
  6.        System.out.println("狗吃骨头");
  7.     }
  8. }
复制代码
4.ChineseDog
  1. package a03loopextendsdemo3;
  2. public class ChineseDog extends Dog{
  3.     @Override
  4.     public void eat(){
  5.         System.out.println("狗吃剩饭");
  6.     }
  7. }
复制代码
5.DogTest
  1. package a03loopextendsdemo3;
  2. public class DogTest {
  3.     public static void main(String[] args) {
  4.         //创建对象并调用方法
  5.         Husky h = new Husky();
  6.         h.eat();  //狗吃狗粮
  7.         h.drink(); //狗喝水
  8.         h.lookHome();  //狗看家
  9.         h.breakHome();  //    拆家
  10.         System.out.println("----------------");
  11.         ChineseDog c = new ChineseDog();
  12.         c.eat();  //狗吃剩饭
  13.         c.drink();  //狗喝水
  14.         c.lookHome();  //狗看家
  15.         System.out.println("----------------");
  16.         SharPei s = new SharPei();
  17.         s.eat(); //狗吃狗粮
  18.         s.drink();  //狗喝水
  19.         s.lookHome();  //狗看家
  20.         System.out.println("----------------");
  21.         Dog d = new Dog();
  22.         d.eat();  //狗吃狗粮
  23.         d.drink();  //狗喝水
  24.         d.lookHome();  //狗看家
  25.         System.out.println("----------------");
  26.     }
  27. }
复制代码
4.继承中的构造方法的访问特点


  • 父类中的构造方法不会被子类继承
  • 子类中全部的构造方法默认先访问父类中的无参构造,再实行自己。
为什么?

  • 子类在初始化的时间,有大概会利用到父类中的数据,如果父类没有完成初始化,子类将无法利用父类的数据。
  • 子类初始化之前,肯定要调用父类构造方法先完成父类数据空间的初始化。
怎么调用父类构造方法的?

  • 子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行。
  • 如果想调用父类有参构造,必须手动写super举行调用。
1.无参


2.有参


3.总结(要看儿子得先看老子)


  • 子类不能继承父类的构造方法,但是可以通过super调用。
  • 子类构造方法的第一行,有一个默认的super();
  • 默认先访问父类中无参的构造方法,再实行自己。
  • 如果想要方法文父类有参构造,必须手动手写。
5.this、super关键字

1.this(就一局部变量)

明白为一个变量,表现当火线法调用的地点值。
2.super

代表父类存储空间。

3.this访问本类方法

表现调用本类其他构造方法
细节:假造机就不会再添加super();

4.实例


1.Empolyee
  1. package a04loopextendsdemo4;
  2. public class Employee {
  3.     //1.类名见名知意
  4.     //2.所有的成员变量都需要私有
  5.     //3.构造方法(空参 带全部参数的构造)
  6.     //4.get/set方法
  7.     private String id;
  8.     private String name;
  9.     private double salary;
  10.     public Employee() {
  11.     }
  12.     public Employee(String id, String name, double salary) {
  13.         this.id = id;
  14.         this.name = name;
  15.         this.salary = salary;
  16.     }
  17.     /**
  18.      * 获取
  19.      * @return id
  20.      */
  21.     public String getId() {
  22.         return id;
  23.     }
  24.     /**
  25.      * 设置
  26.      * @param id
  27.      */
  28.     public void setId(String id) {
  29.         this.id = id;
  30.     }
  31.     /**
  32.      * 获取
  33.      * @return name
  34.      */
  35.     public String getName() {
  36.         return name;
  37.     }
  38.     /**
  39.      * 设置
  40.      * @param name
  41.      */
  42.     public void setName(String name) {
  43.         this.name = name;
  44.     }
  45.     /**
  46.      * 获取
  47.      * @return salary
  48.      */
  49.     public double getSalary() {
  50.         return salary;
  51.     }
  52.     /**
  53.      * 设置
  54.      * @param salary
  55.      */
  56.     public void setSalary(double salary) {
  57.         this.salary = salary;
  58.     }
  59.     public String toString() {
  60.         return "Employee{id = " + id + ", name = " + name + ", salary = " + salary + "}";
  61.     }
  62.     //工作
  63.     public void work(){
  64.         System.out.println("员工在工作");
  65.     }
  66.     //吃饭
  67.     public void eat(){
  68.         System.out.println("员工在吃饭");
  69.     }
  70. }
复制代码
2.Manager
  1. package a04loopextendsdemo4;
  2. public class Manager extends Employee{
  3.     private double bonus;
  4.     //空参
  5.     public Manager() {
  6.     }
  7.     //带全部参数的构造
  8.     public Manager(String id, String name, double salary, double bonus) {
  9.         super(id, name, salary);
  10.         this.bonus = bonus;
  11.     }
  12.     //get/set方法
  13.     public double getBonus() {
  14.         return bonus;
  15.     }
  16.     public void setBonus(double bonus) {
  17.         this.bonus = bonus;
  18.     }
  19.     @Override
  20.     public void work() {
  21.         System.out.println("管理其他人");
  22.     }
  23. }
复制代码
3.Cook
  1. package a04loopextendsdemo4;
  2. public class Cook extends Employee{
  3.     public Cook() {
  4.     }
  5.     public Cook(String id, String name, double salary) {
  6.         super(id, name, salary);
  7.     }
  8.     @Override
  9.     public void work() {
  10.         System.out.println("炒菜");
  11.     }
  12. }
复制代码
4.Test
  1. package a04loopextendsdemo4;
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         //创建对象并赋值调用
  5.         Manager  m= new Manager("001","张三",10000,8000);
  6.         System.out.println(m.getId()+","+m.getName()+
  7.                 ","+m.getSalary()+ ","+m.getBonus());
  8.         m.work();
  9.         m.eat();
  10.         Cook c = new Cook();
  11.         c.setId("002");
  12.         c.setName("李四");
  13.         c.setSalary(20000);
  14.         System.out.println(c.getId()+","+c.getName()+
  15.                 ","+c.getSalary());
  16.         c.work();
  17.         c.eat();
  18.     }
  19. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表