博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
疯狂java学习笔记之面向对象(七) - super关键字
阅读量:5060 次
发布时间:2019-06-12

本文共 2664 字,大约阅读时间需要 8 分钟。

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 }

 

转载于:https://www.cnblogs.com/dtest/p/4166676.html

你可能感兴趣的文章
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>