java 基础 4 super、final关键字及上转型对象的使用

来源:互联网 发布:c语言 运算符 编辑:程序博客网 时间:2024/05/16 14:36
一、super 关键字的使用
当子类的构造方法创建一个子类对象时,子类的构造方法总是调用父类的某个构造方法。也就是说,如果子类的构造方法没有明显的指明使用父类的那个构造方法,子类就调用父类不带参的构造方法。
由于子类不继承父类的构造方法。因此子类在其构造方法中需使用 super 关键字来调用父类的构造方法,而且 super 必须是子类构造方法中的第一行代码,那如果在子类的构造方法中,没有明显的写出 super 关键字,来调用父类的某个构造方法,默认有 super();
实例:
package com.test;

class student {
int number;
String name;

// 无参构造
student() {

}

// 有参构造
student(int number, String name) {
this.number = number;
this.name = name;
System.out.println("我的名字:" + name + "," + "学号是:" + number);
}

}

class Unstudent extends student {
boolean 婚否;

Unstudent(int number, String name, boolean b) {
super(number, name);// 调用父类的带参构造方法
婚否 = b;
System.out.println("婚否=" + 婚否);
}

}

public class Test {
public static void main(String[] args) {
Unstudent zhang = new Unstudent(9901, "何晓琳", false);
}

}

结果:
我的名字:何晓琳,学号是:9901
婚否=false



除掉 super 关键字的结果:子类对象将调用 默认的模式:



默认的 super();方法:




我们不将 super 关键字 放在 方法内的第一行的结果:·········程序将出现错误!!!





二、final关键字的使用:
1. final 关键字不仅可以修饰类、成员变量和方法中的局部变量。还可以声明类,用final声明的类,将不能被继承,既不能有子类。
例如:在 java 中 不允许 用户程序 扩展 String 类,为此 java 将 它 修饰为 final 类。

2. 如果使用final 修饰 父类中的一个方法,那么这个方法不允许子类重写,也就是说,不允许隐藏可以继承 final 修饰的方法。(老老实实继承,不能做任何篡改!!)

3.常量:
使用 final 修饰 成员变量或局部变量,那么它就是常量。常量在运行期间不允许发生变化,所以常量在声明的时没有默认值,因此在声明常量时,必须指定常量的值!!!

三、上转型对象:(在继承中)
我们说“老虎是动物”,这时老虎就失去了老虎独有的属性和功能。从人的思维方式上看这是上溯思维方式,在java中也有类似的思维方式,就是 上转型对象。
例:
Animal a ;
a= new Tiger();
Animal a ;
Tiger b = new Tiger();
a=b;
这时就称 a 是 b 的 上转型对象。

上转型对象:
1. 对象的 上转型对象 的实体是子类负责创建的。但上转型对象会失去原对象的一些属性和动能。(上转型对象相当于子类对象的一个“简化”对象)。

2. 具有的特点:
a.不能操作子类新增的成员(失去的属性)和方法(失去的行为)。
b. 可以访问子类继承或隐藏的成员变量 、 继承的方法 和 子类重写的实例方法。
c.操作子类继承和重写的实例方法,其作用等价于子类对象去调用这些方法。因此,子类重写父类 的某个实例方法后,当对象的上转型对象调用这个实例方法时u,一定是调用了子类重写的实例方法。
注:
1). 不要将父类的对象和子类的上转型对象 混淆。
2).可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了 子类对象所具有的属性和功能。
3).不可以将父类创建的对象的引用赋给子类声明的对象。(不能说:“人是中国人”)。

实例:
//Monkey--类人猿
class Monkey {
void crySpeak(String s ){
System.out.println(s);
}
}

class People extends Monkey {
//新的方法
void jisuan( int x , int y){
int sum;
sum =x+y;
System.out.println(sum);
}
void crySpeak(String s){
System.out.println("重写父类的方法:"+s);
}
}

public class Test {
public static void main(String[] args) {
System.out.println("上转型对象:");
Monkey monkey = new People();//monkey是peolep的上转型对象
monkey.crySpeak("cry");//注意:此处的monkey调用的是子类重写的crySpeak()方法
//monkey.jisuan();//此处访问错误 ,是因为 monkey是peolep的上转型对象,不能访问子类新的方法(下有 配图: 图_01)
People people = (People) monkey;//将上转型对象强制转化为子类的对象
people.jisuan(4, 9);
System.out.println("-------------------------------------------------");
System.out.println("子类对象:");
People people2 = new People();//调用子类的对象
people2.crySpeak("People");
people2.jisuan(8, 9);
}
}

输出结果:


图_01:--特点 a 的应用:






0 0
原创粉丝点击