1.继承是一种由已有的类创建新的类的机制。利用继承,可以先定义一个共有属性的一般类,根据该一般类再定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加它自己的新属性和行为。
【注:java不支持多重继承,即子类只能有一个父类。子类与父类的关系是“is-a”关系。】
2.类有两种重要的成员:成员变量和方法。
3.当父类和子类在同一个包时,可以继承父类用 private/protected 修饰符 修饰的成员变量和方法,不在同一包中将不能继承。
4.在子类继承的方法只能操作子类继承和隐藏的成员变量,子类新定义的方法可以操作子类继承和子类新生明的成员变量,但无法操作子类隐藏的成员变量(需要使用super关键子操作子类隐藏的成员变量。)
5.方法重写(覆盖):
a. 如果子类可以继承父类的某个方法,那么子类就有权重写这个方法。
b. 方法的重写是指:子类中定义一个方法,这个方法的类型和父类的方法类型一致(或者父类的方法的类型的子类型),并且这个方法的名字、参数个数、参数类型和父类的方法完全相同。
c. 重写的目的:
1.子类通过重写可以隐藏继承的方法;子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。
2.重写方法既可以操作继承的成员变量和调用继承的方法,也可以操作子类声明的成员变量、调用新定义的其他方法,但无法操作隐藏的变量和方法。【操作隐藏的变量和方法可以通过super 进行操作!!!】
d. 在重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限。
访问权限由高到低:
public--protected--友好的--private。
注:在java中,如果方法前没有访问权限的修饰,默认是 友好的 。
e.在JDK 1.5 版本以后,子类允许重写方法的类型可以是父类方法类型的子类型。
例:
class A{
Object get(){
return null;
}
}
class B extends A{
Integer get(){ //Integer是Object的子类
return new Integer(100);
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
Integer t = b.get();
System.out.println(t.intValue());
}
}
输出结果:100
【拓展:
inValue的使用:
1.intValue()是java.lang.Number类的方法,Number是一个抽象类。Java中所有的数值类都继承它。也就是说,不单是Integer有intValue方法,Double,Long等都有此方法。
2.此方法的意思是:输出int数据。每个数值类中具体的实现是不同的。
例如:
Float类和Double类的intValue方法,就是丢掉了小数位,而Long的intValue方法又不一样的。
】
最后用例子进行一下总结:
【继承、重写的例子】
class University{
void enterRule( double math,double enghlish, double chinese){
double total = math+enghlish+chinese;
if (total>=180) {
System.out.println(total+":分数达到大学分数线!");
}else{
System.out.println(":分数未达到大学分数线!");
}
}
}
class ImportantUniversity extends University{
void enterRule( double math,double enghlish, double chinese){
double total = math+enghlish+chinese;
if (total>=220) {
System.out.println(total+":分数达到名牌大学分数线!");
}else{
System.out.println(total+":分数未达到名牌大学分数线!");
}
}
}
public class Test {
public static void main(String[] args) {
double math = 6, enghlish = 50, chinese = 95;
ImportantUniversity iu = new ImportantUniversity();
iu.enterRule(math, enghlish, chinese);//调用重写的方法
System.out.println("");
math=59;
enghlish=86;
chinese=80;
iu.enterRule(math, enghlish, chinese);//调用重写的方法
}
}
输出结果:
151.0:分数未达到名牌大学分数线!
225.0:分数达到名牌大学分数线!