Java类与对象07:继承

继承(核心)

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

  • extends的意思是“扩展”.子类是父类的扩展

  • Java中类只有单继承,没有多继承(一个儿子只能有一个爸爸,但是一个爸爸可以有多个儿子)

  • 继承是类和类之间的一种关系。除此之外,类与类之间的关系还有依赖,组合,聚合等。
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类使用extends来表示。
  • 子类和父类之间从意义上讲应该具有“is a"的关系
    • package fatherson;
      
      //Person 人
      public class Person {
      }
      

    package fatherson;
    //学生 is 人
    public class Student extends Person{
    }
    

    package fatherson;
    //Teacher is 人
    public class Teacher extends Person {
    }
    
    • Teacher与Student与Person都有一点点关系

意思

  • 继承(extends)的意思是“扩展”,子类是父类的扩展。

  • 上面的三个中Person是父类而Student与Teacher是子类或者叫做派生类。

示例代码

  • package fatherson;
    
    //Person 人//现实中儿子可以继承父亲的所有东西
    //而这:子类可以继承父类的所有方法
    public class Person {
        public int money=10_0000_0000;
     public void say(){
         System.out.println("说话");
     }
    
    }
    

package fatherson;
//学生 is 人
//子类继承了父类,就会拥有父类的全部方法
public class Student extends Person{

}
  • ackage fatherson;
    
    public class Application {
        public static void main(String[] args) {
            Student student=new Student();
            student.say();
            //由于继承的关系子类也能”说话了“
            System.out.println(student.money);
        }
    }
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpfruX0s-1632919359402)(D:\JAVA学习图片\java面向对象\22.png)]

当修饰符不是public时
  • public

  • protected(受保护的)

  • default(默认)

  • private

    • 当修饰符为private时(更改上述代码的money)
    • package fatherson;
      
      //Person 人//现实中儿子可以继承父亲的所有东西
      //而这:子类可以继承父类的所有方法
      public class Person {
         private int money=10_0000_0000;
       public void say(){
           System.out.println("说话");
       }
      }
      
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OShFSY3T-1632919359404)(D:\JAVA学习图片\java面向对象\23.png)]

    • 父亲私有的东西儿子不能继承!

    • 但是父亲可以留一些方法(封装)让儿子调用

    • package fatherson;
      
      //Person 人//现实中儿子可以继承父亲的所有东西
      //而这:子类可以继承父类的所有方法
      public class Person {
         private int money=10_0000_0000;
       public void say(){
           System.out.println("说话");
       }
      
          public int getMoney() {
              return money;
          }
      
          public void setMoney(int money) {
              this.money = money;
          }
      }
      

    package fatherson;public class Application {    public static void main(String[] args) {        Student student=new Student();        student.say();        //由于继承的关系子类也能”说话了“        System.out.println(student.getMoney());    }}
    

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXnHR7lE-1632919359404)(D:\JAVA学习图片\java面向对象\24.png)]

快捷键

  • Ctrl+H(显示继承树)(一定要大写)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37lvJ4Ls-1632919359405)(D:\JAVA学习图片\java面向对象\25.png)]

  • 发现有一个object

    • 把person的东西删掉然后用.看一下发现有很多类

    • 因为所有的类都默认直接或间接继承Object

super详解

  • super调用父类的构造方法,必须在构造方法的第一个

  • super必须只能出现在子类的方法或者构造方法中

  • super和this不能同时调用构造方法

  • 示例代码

    • package fatherson;public class Application {    public static void main(String[] args) {     Student student=new Student();     student.test(("鲁邦"));    }}
      

    package fatherson;//Person 人//现实中儿子可以继承父亲的所有东西//而这:子类可以继承父类的所有方法public class Person {         protected String name="amy aining";}
    

    package fatherson;//学生 is 人public class Student extends Person{     private String name="阿米"; public void test(String name){     System.out.println(name);//指代的是ublic void test(String name)     System.out.println(this.name);//指代的是private String name="阿米";     System.out.println(super.name);//调用的是父类的name }}
    
    • 运行后

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rq1QfrEg-1632919359406)(D:\JAVA学习图片\java面向对象\26.png)]
  • 还能继承父类的方法

    • package fatherson;public class Application {    public static void main(String[] args) {     Student student=new Student();     //student.test(("鲁邦"));        student.test1();    }}
      

    package fatherson;//Person 人//现实中儿子可以继承父亲的所有东西//而这:子类可以继承父类的所有方法public class Person {         protected String name="amy aining";         public void print(){             System.out.println("person");         }}
    

    package fatherson;//学生 is 人public class Student extends Person{     private String name="阿米";    public void print(){        System.out.println("Student");    } public void test(String name){     System.out.println(name);//指代的是ublic void test(String name)     System.out.println(this.name);//指代的是private String name="阿米";     System.out.println(super.name);//调用的是父类的name } public void test1(){        print();        this.print();        super.print(); }}
    
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-niyI6yAu-1632919359407)(D:\JAVA学习图片\java面向对象\27.png)]
  • 注意

  • 将Person(父类)中的关键词从public变成private

  • 会发现

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JFwIiTcv-1632919359408)(D:\JAVA学习图片\java面向对象\28.png)]
  • 所以私有的不会被继承

构造器的相关问题

  • 类中有默认的构造器

  • 调用一个对象会先走无参构造器

  • package fatherson;public class Application {    public static void main(String[] args) {     Student student=new Student();     //student.test(("鲁邦"));      //  student.test1();    }}
    

package fatherson;//Person 人//现实中儿子可以继承父亲的所有东西//而这:子类可以继承父类的所有方法public class Person {    public Person() {System.out.println("Person无参执行了");    }    protected String name="amy aining";      public void print(){          System.out.println("person");         }}

  •     package fatherson;import com.company.Hello;//学生 is 人public class Student extends Person{    public Student() {        //隐藏代码:调用了父类的无参构造        super();//调用父类的构造器,必须要在子类构造器的第一行        System.out.println("Student无参执行了");    }    private String name="阿米";    public void print(){        System.out.println("Student");    } public void test(String name){     System.out.println(name);//指代的是ublic void test(String name)     System.out.println(this.name);//指代的是private String name="阿米";     System.out.println(super.name);//调用的是父类的name } public void test1(){        print();//Student        this.print();//Student        super.print();//Person }}
    
    • 运行后发现

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MlhpIhBR-1632919359409)(D:\JAVA学习图片\java面向对象\29.png)]

  • 注意这里有一行隐藏代码

  • 在Student时调用了父类的无参构造super();

  • 而且调用父类的构造器必须在子类构造器的第一行;

  • this也是同理

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qycBrjS6-1632919359410)(D:\JAVA学习图片\java面向对象\30.png)]

  • 无参构造必须存在否则不能运行。


super与this的区别

  • 代表对象不同:

    this:本身调用者这个对象

    super:代表父类的对象的应用

  • 前提

    this:没有继承也可以使用

    super:只能在继承条件下才能使用

  • 构造方法

    this():本类的构造

    super():父类的构造

重写

  • 先重新定义两个类

    • package Fatherandson1;public class A extends B{        public static void test(){            System.out.println("A>=test");        }}
      

    package Fatherandson1;//重写都是方法的重写,和属性无关public class B {    public static void test(){        System.out.println("B>=test");    }}
    

    • package Fatherandson1;public class Application {    public static void main(String[] args) {        A a=new A();        a.test();//调用的是A的test        //之后的蜜汁操作        B b=new A();//new的都是A但是结果却不同        b.test();//B        //他们之间有继承关系。        //父类的引用指向子类。理解:儿子有困难爸爸给以给予帮助                        //B>=test        //B>=test    }}
      

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0grpzkS-1632919359411)(D:\JAVA学习图片\java面向对象\31.png)]


  • 将static去掉之后

  • 发现有明显的不一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmCJrrjG-1632919359412)(D:\JAVA学习图片\java面向对象\32.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yb9YIy2-1632919359413)(D:\JAVA学习图片\java面向对象\33.png)]

  • 这就是方法的重载

    • 用Alt加Insert键之后

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NvXICLkn-1632919359414)(D:\JAVA学习图片\java面向对象\34.png)]

    • 发现有个重写方法

    • 使用这个重写方法

    • 再运行


    package Fatherandson1;//重写都是方法的重写,和属性无关public class B {    public void test(){        System.out.println("B>=test");    }}
    

    • package Fatherandson1;public class A extends B {    //Override 重写    @Override //注解:有功能的注释    public void test() {        System.out.println("A>=test");    }}
      

    package Fatherandson1;public class Application {    public static void main(String[] args) {        A a=new A();        a.test();//调用的是A的test           //父类的引用指向了子类        B b=new A();//子类重写了父类的方法        b.test();//B                //A>=test        //A>=test    }}
    


    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtCP7YPx-1632919359414)(D:\JAVA学习图片\java面向对象\35.png)]
  • 发现静态的方法和非静态的方法区别很大

    • 如果是非静态的才算重写

    • 重写的关键词是public不能是private

重写的注意点

  • 需要有继承关系,子类重写父类的方法。

  • 参数列表也必须相同,否则就是重载了

  • 修饰符:范围可以扩大,但是不能缩写:public》protected>default>private

  • 抛出的异常:范围,可以缩小,但不能扩大ClassNotFoundException–>Exception(大)

    • 子类的方法和父类必须一致,方法体不同

    • 快捷键:Alt+insert;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值