java随笔:super关键字

super关键字

一、概念引入。

  1.假如你在某个公司工作,这个公司中经理的待遇与普通员工的待遇存在一些差异。不过,他们之间也存在很多相同的地方,例如,他们都能领取薪水。只是普通员工在完成本职任务以后仅领取薪水,而经理在完成了预期的业绩之后还能领到奖金。下面用部分代码表示这段信息。

1 public class Manager extends Employee{
2     //这里增加一个用于存储奖金信息的域,以及设置这个域的新方法
3     private double bonus;
4     public void setBonus(double bonus){
5         this.bonus=bonus;
6     }
7 }

  2.覆盖方法。

  由于超类中的有些方法对子类Manager并不一定适用。Manager类中的getSalary方法应该返回的是薪水与奖金的总和。为此,需要提供一个新的方法来覆盖父类中的这个方法:

1 public class Manager extends Employee{
2     //******
3     public double getSalary(){
4     //******
5     }
6 }

  假如要实现这个方法似乎只要返回salary和bonus域的总和就可以了:

1 public class Manager extends Employee{
2     //******
3     public double getSalary(){
4         return salary+bonus;
5     }
6 }

  然而,这个方法并不能运行。因为Manager类的getSalary方法不能够直接访问超类的私有域。也就是说,尽管每个Manager对象都拥有一个名为salary的域,但在Manager类的getSalary方法中并不能够直接访问salary域。只有Employee类的方法才能够访问私有部分。如果Manager类的方法一定要访问私有域,就必须借助与公有的接口,,Employee类中的共有方法getSalary正是这样一个接口。

1 public class Manager extends Employee{
2     //******
3     public double getSalary(){
4         double baseSalary=getSalary();
5         return basesalary+bonus;
6     }
7 }

  但是这样的代码会导致无限次地调用自己,知道程序崩溃。

  总结:我们希望调用超类Employee中的getSalary方法,而不是当前类的这个方法。为此,可以使用特定的关键字super解决这个问题。

二、super作用简单介绍。

  1.super()从子类中调用父类的构造方法。

  2.在子类中访问父类被屏蔽的方法或属性。

  结合第一点Employee类中的getSalary方法。下面是Manager类中getSalary方法的正确书写格式:

1 public class Manager extends Employee{
2     //******
3     public double getSalary(){
4         double baseSalary=super.getSalary();
5         return basesalary+bonus;
6     }
7 }

  子类中可以增加减域或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。

三、请允许我又扯回构造器。

 1 public class Manager extends Employee{
 2     //******
 3     private double bonus;
 4     public double getSalary(){
 5         double baseSalary=super.getSalary();
 6         return basesalary+bonus;
 7     }
 8     public Manager(String name,double salary,int year,int month,int day){
 9         super(name,salary,year,month,day);
10         bonus=0;
11     }
12 }

  由于Manager类的构造器不能访问Employee类的私有域,所以必须利用Employee类的构造器对这部分进行初始化,我们可以通过super实现对超类的调用。使用super调用构造器的语句必须是子类构造器的第一条语句。

  如果子类的构造器没有显示地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参的构造器,并且在子类的构造器中又没有显示地调用超类地其他构造器,则java编译会报错。

四、super与this的比较。

  有些人认为super与this引用是类似的概念,实际上,这样比较并不恰当。这是因为super不是一个对象的引用,不能将super赋给另一个对象变量,他只是一个指示编译器调用超类方法的特殊关键字。

  关键字this有两个用途:一是调用隐式参数,二是调用该类其他的构造器(like this,【this("李四",18)】)。

  关键字super也有两个用途:一是调用超类的方法,二是调用超类的构造器。

  在调用构造器的时候,这两个关键字的使用方式很相似。调用构造器的语句只能作为另一个构造器的第一条语句出现。构造参数既可以传递给本类的其他构造器,也可以传递给超类的构造器。

五、注意点。

  1.super()从子类中调用父类的构造方法,this()在同一类内调用其它构造方法。

  2.this()和super()不能同时出现在一个构造函数里面。

  3.super()和this()均需放在构造方法内第一行。

  4.this()和super()都指的是对象,所以,均不可以在static环境中使用。

时间: 2024-10-12 16:48:37

java随笔:super关键字的相关文章

JAVA面向对象-----super关键字

JAVA面向对象-–super关键字 1:定义Father(父类)类 1:成员变量int x=1; 2:构造方法无参的和有参的,有输出语句 2:定义Son类extends Father类 1:成员变量int y=1; 2:构造方法无参和有参的.有输出语句this.y=y+x; 3:创建Son类对象 Son son=new Son(3); System.out.println(son.y); //4 class Father { int x = 1; Father() { System.out.p

java之super关键字

super关键字: 在java中使用super来引用基类的成分. 程序code: class FatherClass{ public int value; public void f(){ value = 100; System.out.println("FatherClass.value:"+value); } } class ChildClass extends FatherClass{ private int value; public void f(){ super.f();

Java中super关键字的作用与用法

Java中的super是什么?java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中.主要用于以下情况: 1.使用super与变量:当派生类和基类具有相同的数据成员时,会发生此情况.在这种情况下,JVM可能会模糊不清.我们可以使用以下代码片段更清楚地理解它: /* Base class vehicle */ class Vehicle { int maxSpeed = 120; } /* sub class Car extending vehic

Java基础-super关键字与this关键字

用super调用父类构造方法 类如果没有显式声明构造方法,则自动生成无参数的默认构造方法. 1.先用一个无参数的父类构造方法验证一下, 执行子类构造方法会自动调用父类的构造方法.测试代码: class Human3{ public Human3(){ System.out.println("构造一个人"); } } class Pupil3 extends Human3{ public Pupil3(){ // super(); //本句注释与不注释执行结果是一样的 System.ou

java中super关键字的作用

1.super关键字可以在子类的构造方法中显示地调用父类的构造方法,super()必须为子类构造函数中的第一行. 2.super可以用来访问父类的成员方法或变量,当子类的方法或成员变量与父类有相同的名字时也会覆盖父类的成员变量或方法,这个时候要想访问父类的成员变量或方法只能通过super关键字来访问,子类方法中的super.方法名()不需要位于第一行. package test; class FatherClass { public int value; public void f() { va

JAVA基础--super关键字

super一般出现子类的构造方法中.super语句必须写在第一行,super一般用来调用父类的构造方法.是为了给父类的属性初始化,以便子类使用这些属性. 子类继承后,如果没有定义自己的属性或者重写自己的方法,那么当创建对象之后,对象调用的就是父类中的属性和方法. 如果拥有则使用自己的属性和方法. 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候(调用构造器的时候)这个子类对象里面又会创建一个父类对象super.

java的super和this关键字用法总结

------super关键字------ super用途:在子类中访问超类“被隐藏的成员变量(无论是否静态)和静态方法”以及“被重写的实例方法”.这里的超类必须是“直接超类”,即子类之上最近的超类.        super的用法:        ①在子类构造方法中调用超类的构造方法,用“super(ParamList)”的方式调用,ParamList根据超类构造方法而定,可以为空.另外super(ParamList)必须是子类构造方法的第一句.        ②当超类的成员变量因与子类的成员变

Java 方法重写和 Super 关键字

方法重写 在 Java 继承中,也存在着重写的概念,其实就是子类定义了和父类同名的方法. 定义:方法名称相同,返回类型相同,参数也相同.代码如下: package hello; class Father01{ public void tell(){ System.out.println("父类调用方法"); } } class Son01 extends Father01{ public void tell(){ System.out.println("子类调用方法"

Java中this和super关键字

今天练习到Java中的this和super关键字,我有如下总结: 1.子类继承父类,子类初始化对象,必须先调用父类构造方法,因为随时有可能要使用父类的成员变量. 2.get和set方法只是对成员变量进行赋值操作,而非初始化. 3.构造方法既能对成员变量进行初始化,又能对其进行赋值操作. 4.子类只要调用父类的构造方法(不管是带参还是无参都行,都用super(······)调用)即可对父类的成员进行初始化, 5.如果子类有两个构造方法,一个可以调用父类带参构造方法,另一个可以用this(···)调