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 }
  • 相关阅读:
    python一次性解压多层嵌套zip压缩包
    zabbix自定义监控项、添加图形、设置触发器、远程执行命令
    制作自己的docker镜像
    vue-router的Import() 异步加载模块问题的解决方案
    Idea Maven配置镜像地址总出问题,麻烦检查一下这里!(最新)
    杂谈:开发人员如何进行复杂业务的学习?让boss刮目相看
    Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)
    整理一些大厂的开源平台及github,向他们看齐...
    Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)
    Java图片处理:ico格式转 PNG/JPG等格式
  • 原文地址:https://www.cnblogs.com/dtest/p/4166676.html
Copyright © 2011-2022 走看看