zoukankan      html  css  js  c++  java
  • 疯狂java学习笔记之面向对象(七)

    super有以下两大作用:

      1、起限定作用强制去访问父类的成员(Field、方法)

      2、起调用作用:指定/显示调用父类的某个构造器

    super调用规则:

      1、子类构造器总会调用父类构造器一次,默认情况下子类构造器会自动调用父类无参数的构造器;

      2、若希望明确指定子类构造器调用父类哪个构造器,可以用super(参数,参数,....),到底调用哪个父类构造器取决于super后面传入的形参列表;

      3、this()调用与super()调用都必须出现在构造器的第一行,所以他们两个调用时不能同时出现的.

    约定俗成:

      1、若没有super()调用,也没有this()调用,默认子类构造器会自动调用父类无参数构造器;

      2、若有super()调用,根据super()调用传入的形参列表去决定调用哪个父类构造器;

      3、若有this()调用,子类构造器会找到this()调用所对应的子类中被重载的构造器

    例1:在方法中使用super.起限定作用

     1 class Fruit{
     2     private String color;
     3     private double weight;
     4     
     5     public Fruit(){}
     6     public Fruit(String color , double weight){
     7         this.color = color;
     8         this.weight = weight;
     9     }
    10 
    11     public void info(){
    12         System.out.println("这是一个水果哦!");
    13         System.out.println("水果颜色是:" + color + ",重量为:" + weight);
    14     }
    15 }
    16 
    17 
    18 public class Apple extends Fruit{
    19     public void info(){
    20         System.out.println("这是个苹果!");
    21     }
    22 
    23     public void test(){
    24         System.out.println("~~Apple test 方法");
    25         //this.info(); - 通过this. 调用info默认总是调用本类中定义的info()方法
    26         super.info();  //- 通过super. 限定后强制调用父类中的info()方法
    27     }
    28 
    29     public static void main(String[] args){
    30         Apple a = new Apple();
    31         a.test();
    32     }
    33 }

    例2:在Field中使用super. 同样起限定作用

     1 class Demo{
     2     int count = 2;
     3 }
     4 
     5 public class TestDemo extends Demo{
     6     int count = 10;
     7     public void test(){
     8         //默认count(即count前不加this./super.)时,其前面默认省略了this
     9         //若一定要使用父类的count Field必须在其前面加上super.
    10         System.out.println("test方法访问当前类的count为:" + this.count);
    11         System.out.println("test方法访问父类的count为:" + super.count);
    12     }
    13 
    14     public static void main(String[] args){
    15         TestDemo t = new TestDemo();
    16         t.test();
    17     }
    18 }

    例3:通过super调用父类构造器

     1 class Person{
     2     protected String name;
     3     protected int age;
     4     protected String sex;
     5 
     6     //程序员定义了有参构造器,因此系统不会再为该类生成无参构造器
     7     public Person(String name , int age , String sex){
     8         this.name = name;
     9         this.age = age;
    10         this.sex = sex;
    11     }
    12 
    13     //假如不定义方法,直接在main方法中调用name/age/sex 参数编译时会报错"staic方法不能引用非static变量"
    14     public void info(){
    15         System.out.println("老师的名字叫:" + name + ",年龄为:" + age + ",性别为:" + sex);
    16     }
    17 }
    18 
    19 public class Teacher extends Person{
    20     private String sex;
    21 
    22     //若不指定构造器,默认会去调用父类的无参构造器,但父类又没有无参构造器则报错
    23     public Teacher(String name , int age , String sex){
    24         super(name,age,sex);
    25     }
    26     
    27     
    28     public static void main(String[] args){
    29         Teacher tt = new Teacher("haha",30,"male");
    30         tt.info();
    31     }
    32 }
  • 相关阅读:
    Centos 7 zabbix 实战应用
    Centos7 Zabbix添加主机、图形、触发器
    Centos7 Zabbix监控部署
    Centos7 Ntp 时间服务器
    Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
    Kickstart 安装centos7
    Centos7与Centos6的区别
    Linux 150命令之 文件和目录操作命令 chattr lsattr find
    Linux 发展史与vm安装linux centos 6.9
    Linux介绍
  • 原文地址:https://www.cnblogs.com/dtest/p/4166676.html
Copyright © 2011-2022 走看看