zoukankan      html  css  js  c++  java
  • Java基础(9) | 继承

    # 面向对象的三大特性:

    封装,继承,多态

    没有继承就没有多态!
    继承主要解决的问题就是:共性抽取
    java中只能单继承,没有多继承,但是可以多级继承!

    # 定义子类的格式:

    public class 子类名称 extends 父类名称 {}
    

    # 在继承关系中,变量重名,如何通过子类对象访问

    直接通过子类对象访问成员变量:
    等号左边是谁,就优先用谁,没有则向上找

    间接通过成员方法访问成员变量:
    该方法属于谁,就优先用谁,没有则向上找

    # 区分重名变量:

    局部变量:直接写
    父类成员变量:super.变量名
    子类成员变量:this.变量名

    # 方法覆盖注意事项

    1.方法名称必须相同,参数列表也要相同
    2.子类方法的返回值必须小于等于父类方法的返回值
    3.子类方法的权限必须大于或者等于父类方法的权限

    # 继承关系中,父子类构造方法的访问特点

    1.子类必须先调用父类构造方法,没写编译器会自动添加一个默认隐含的super()方法,调用父类无参构造方法先执行父类的构造方法,在执行子类自己的构造方法
    2.子类构造方法可以通过super关键字来调用父类重载构造
    3.super的父类构造的调用必须是子类构造方法的第一个语句,而且有且只能有一个

    # super关键字

    1.在子类的构造方法中,访问父类的构造方法
    2.在子类的成员方法中,访问父类的成员变量
    3.在子类的成员方法中,访问父类的成员方法

    # this关键字

    1.在本类的构造方法中, 访问本类的另一个构造方法
    2.在本类的成员方法中, 访问本类的成员变量 //局部变量与成员变量重名
    3.在本类的成员方法中, 访问本类的另一个成员方法
    this()调用也必须是构造方法中的第一个语句,且唯一

    ## 注意:

    super() 和 this() 两种构造调用不能同时使用

    # this & super demo

    ## 父类

    package com.leerep.javabase.extendsDemo.thisDemo;
    
    public class Fu {
        String var = "var in Fu";
    
        public Fu(){
        }
    
        public Fu(String fu){
            System.out.println("父类有参构造,参数为:{"+fu+"}");
        }
    
        public void getMethod(){
            System.out.println("getMethod in Fu");
        }
    }
    

    ## 子类

    package com.leerep.javabase.extendsDemo.thisDemo;
    
    public class Zi extends Fu {
        String var = "var in Zi";       //成员变量
    
        public Zi() {
            this("[1. this调用本类有参构造]子类无参构造开始执行----> 调用子类有参构造");     //1. this调用本类构造方法
            System.out.println("[子类无参构造执行完]");
        }
    
        public Zi(String zi) {
            super(zi);              //1. super调用父类构造方法
            System.out.println("{1. super调用父类有参构造}子类有参构造----> 调用父类有参构造");
        }
    
        public void getMethod() {
            System.out.println("getMethod in Zi");
        }
    
        public void getSuperMethod() {
            System.out.print("调用getSuperMethod---->{2. super在子类中调用父类getMethod()方法}		");
            super.getMethod();      //2. super在子类中调用父类成员方法
        }
    
        public void getThisMethod() {
            System.out.print("调用getThisMethod---->[2. this在子类中调用父类getMethod()方法}		");
            this.getMethod();       //2. this调用本类成员方法
        }
    
        //当变量重名时
        public void whenVarHasSameName() {
            String var = "var in whenVarHasSameName Method";        //局部变量
            System.out.println("局部变量:" + var);
            System.out.println("3. this访问本类成员变量:" + this.var);         //3. this访问本类成员变量
            System.out.println("3. super访问父类成员变量:" + super.var);      //3. super访问父类成员变量
        }
    }
    

    ## demo

    package com.leerep.javabase.extendsDemo.thisDemo;
    
    public class Demo {
        public static void main(String[] args) {
            System.out.println("创建一个父类:有参构造");
            System.out.println("-----------------------------");
            Fu fu = new Fu("Fu");
            fu.getMethod();
            System.out.println();
    
            System.out.println("创建一个子类:有参构造");
            System.out.println("-----------------------------");
            Zi zi = new Zi("Zi");
            zi.getMethod();
            zi.getThisMethod();
            zi.getSuperMethod();
            zi.whenVarHasSameName();
            System.out.println();
    
            System.out.println("创建一个子类:无参构造");
            System.out.println("-----------------------------");
            Zi z = new Zi();
        }
    }
    

  • 相关阅读:
    数据库的未来:ORM+LINQ+RX
    工具论-科学是实用工具
    事务、锁与原子性
    ORM-面向对象&关系数据库
    swift Class的内存布局
    使用phpexcel导出到xls文件的时候出现乱码解决
    苹果CMS
    js网页如何获取手机屏幕宽度
    常用正则说明
    php中的线程、进程和并发区别
  • 原文地址:https://www.cnblogs.com/leerep/p/14389326.html
Copyright © 2011-2022 走看看