super有以下两大作用:

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

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

super调用规则:

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

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

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

约定俗成:

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

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

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

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

 class Fruit{
private String color;
private double weight; public Fruit(){}
public Fruit(String color , double weight){
this.color = color;
this.weight = weight;
} public void info(){
System.out.println("这是一个水果哦!");
System.out.println("水果颜色是:" + color + ",重量为:" + weight);
}
} public class Apple extends Fruit{
public void info(){
System.out.println("这是个苹果!");
} public void test(){
System.out.println("~~Apple test 方法");
//this.info(); - 通过this. 调用info默认总是调用本类中定义的info()方法
super.info(); //- 通过super. 限定后强制调用父类中的info()方法
} public static void main(String[] args){
Apple a = new Apple();
a.test();
}
}

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

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

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

 class Person{
protected String name;
protected int age;
protected String sex; //程序员定义了有参构造器,因此系统不会再为该类生成无参构造器
public Person(String name , int age , String sex){
this.name = name;
this.age = age;
this.sex = sex;
} //假如不定义方法,直接在main方法中调用name/age/sex 参数编译时会报错"staic方法不能引用非static变量"
public void info(){
System.out.println("老师的名字叫:" + name + ",年龄为:" + age + ",性别为:" + sex);
}
} public class Teacher extends Person{
private String sex; //若不指定构造器,默认会去调用父类的无参构造器,但父类又没有无参构造器则报错
public Teacher(String name , int age , String sex){
super(name,age,sex);
} public static void main(String[] args){
Teacher tt = new Teacher("haha",30,"male");
tt.info();
}
}

疯狂java学习笔记之面向对象(七) - super关键字的更多相关文章

  1. 疯狂java学习笔记之面向对象(四) - this关键字

    Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...

  2. 疯狂java学习笔记之面向对象(八) - static和final

    一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Fie ...

  3. Java学习笔记之面向对象、static关键字

    一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...

  4. 疯狂java学习笔记之面向对象(五) - 封装、继承、多态

    一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...

  5. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  6. 疯狂java学习笔记之面向对象(九) - 抽象和接口

    一.抽象(abstract): 1.抽象类: 使用abstract修饰的类就是抽象类; 相比于普通类抽象类增加了支持抽象方法的功能,但也丢失了创建实例的功能(抽象类中不能创建实例),其他普通类有的抽象 ...

  7. 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

    一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...

  8. 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

    方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...

  9. 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量

    Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...

随机推荐

  1. HTML标签汇总

    标签 描述 DTD(Document Type Definition) <!-- --> 定义html注释 STF <a> 定义链接或者锚点 STF <abbr> ...

  2. XMPP框架下微信项目总结(1)环境配置

    xmpp介绍 xmpp基于模块开发的 无须自己写请求 (登陆,注册,获取好友列表,添加/删除好友等) ------>简介 ------------------------- ----->工 ...

  3. I2C学习

    详细的解释: 读写状态机图

  4. ios 拨打电话

    1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString * str=[[NSMutableString alloc] initWithFo ...

  5. Hibernate的ORM原理和实现

    >>Hibernate和ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样 ...

  6. Delphi中的接口和抽象类

    参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...

  7. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  8. 无废话ExtJs 入门教程五[文本框:TextField]

    无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ...

  9. revert merge会出现的问题

    比如当我们git revert的时候, git revert Git会抱怨: is a merge but no -m option was given 这是因为你revert的那个commit是一个 ...

  10. 使用pl/sql監控PROCEDURE執行時間

    創建表 CREATE TABLE PROCESS_TIMING_LOG (   PROCESS_NAME       VARCHAR2(50 BYTE),   EXECUTION_DATE     D ...