zoukankan      html  css  js  c++  java
  • JAVA中使用super调用属性、方法、构造器

    子类中super关键字的使用


       1.super可以理解为父类的

       2.super可以用来调用属性,方法,构造器

       3.在子类中使用super调用属性和方法

         3.1在子类的方法或构造器中,通过使用“super.属性”或者“super.方法”的方式 ,显示的调用父类中声明的属性或者方法 但是,通常情况下,我们习惯省略 “super.”

         3.2特殊情况,当子类和父类中定义了同名的属性时,想要调用父类中声明的属性,就需要通过“super.属性”的方式来表明调用的是父类中声明的属性

         3.3特殊情况,当子类重写了父类中的方法以后,想在子类的方法中调用父类被重写的方法时,则必须显示的使用“super.方法” 来表明调用的是父类中被重写的方法

      4.在子类中使用super调用父类的构造器

        4.1我们可以在子类的构造器中显示的使用“super(形参列表)”的方式,来调用父类中声明的指定的构造器 

        4.2“super(形参列表)”的使用,必须声明在子类构造器的首行

        4.3我们在类的构造器中,针对于“this(形参列表)”和“super(形参列表)”只能二选一,不能同时出现。“this(形参列表)”表示子类中重载的构造器,“super(形参列表)”表示调用父类的构造器

        4.4在构造器的首行,没有显示的调用“this(形参列表)”和“super(形参列表)”时,则默认调用的是父类中空参的构造器,super()

        4.5在类的多个构造器中,至少有一个类的构造器使用了“super(形参列表)”调用父类中的构造器,不可能全是“this(形参列表)”。

    新建一个父类Person

    public class Person {
        String name="张三";
        int age=21;
        int id=1001001001;//证号
    
        //空参构造器
        public Person(){
            System.out.println("我无处不在!");
        }
        //一个参数的构造器
        public Person(String name){
            this.name = name;
        }
        //多个参数的构造器
        public Person(String name,int age){
            this(name);
            this.age = age;
        }
    
        public void eat(){
            System.out.println("人吃饭");
        }
        public void walk(int distance){
            System.out.println("人走路,走的距离是"+distance+"公里");
        }
    }

    再新建一个子类Student,继承上面的父类Person

    package com.guigu.exer;
    
    import com.guigu.exer.Person;
    
    public class Student extends Person {
    
        String major;
        int id=10086;//学号
        //子类空参构造器
        public Student(){
    
        }
        //子类一个参数的构造器
        public Student(String major){
            //这个构造器的首行有一个默认的super(),不写时,编辑器会自动加上该默认super()
            //super();
            this.major = major;
        }
        //子类中多个参数的构造器
        public Student(String name,int age,String major){
            //使用"super(形参列表)"的方式调用父类中指定形参的构造器
            //使用"super(形参列表)"的时候,必须声明在子类构造器的首行
            super(name,age);
            this.major = major;
    
        }
    
        //该方法对父类方法进行了重写
        @Override
        public void eat(){
            System.out.println("学生吃饭");
        }
    
        public void show(){
            //此时的name、age前面可以省略this
            System.out.println("name=" + name + "," + "age=" + age);
            //这里的this,super都可以调用,第一是因为子类和父类没有属性冲突的情况,都在堆空间去找且仅有一个name、age
            System.out.println("name=" + this.name + ","+ "age=" + super.age);
            //因为子类和父类都有一个同名的属性,此时在堆空间是有两个id的, 默认调用的是子类的属性,这里省略了一个this
            System.out.println("子类中的id=" + id);
            //如果想要调用父类的属性,需要在前面加上一个super
            System.out.println("父类中的id = "+ super.id);
        }
    
        public void study(){
    
            System.out.println("学生,好好学习,天天向上");
            //这里的调用省略了前面的“this.”
            eat();
            super.eat();
            //因为walk没有被重写,那么在子类中调用时,可以省略this,也可以使用"this.",还可以使用"super."
            //使用“this."和"super."的区别在于:“this."会先在本类去找,没有找到再去父类找该方法,使用"super."直接去父类去找该方法
            walk(2);
            this.walk(3);
            super.walk(5);
        }
    
    }

    新建一个测试类,来验证一下,看看打印结果

    package com.guigu.exer;
    
    public class SuperTest {
        /**
         * @param args
         */
    
        public static void main(String[] args) {
            Student student =new Student();
            student.show();
            student.study();
            System.out.println("------------------");
            Student s1= new Student("Tom",21,"IT");
            s1.show();
            System.out.println("********************");
            Student s2= new Student(); 

        

  • 相关阅读:
    js中FOR循环的陷阱
    Struts2学习第七课 result
    Struts2学习第七课 ActionSupport
    Struts2学习第六课 实现登录登出功能
    Struts2学习第五课 通过和ServletAPI耦合的方式获取WEB资源
    Struts2学习第四课 通过Aware接口获取WEB资源
    子类重写父类的方法
    字节流和字符流
    Java数据库连接库JDBC用到哪种设计模式?
    Java接口
  • 原文地址:https://www.cnblogs.com/king2/p/14520909.html
Copyright © 2011-2022 走看看