1.继承的优点:
1.继承优化设计
2.方便修改代码(父类),减少代码量(子类)
2.子类重写父类
3.继承一下执行构造的顺序
//父类
class Pet{
//公共的属性和方法
}
//子类
class Dog extends Pet{
继承关键词上面
//子类特有的公共属性和方法
}
子类访问父类成员============>使用super关键字,super代表父类对象
1.访问父类构造方法===========>在子类构造方法中调用且必须是第一句!!!!
super();无参
super(参数);有参
2.访问父类属性
super.参数;
3.访问父类方法
super.方法();
继承语法:
修饰符 子类 extends 父类{
//类定义部分
}
继承通过extends关键字来实现,其中的父类被称为父类,基类或超类。修饰符如果是public,则该类在整个项 目中可见;若无public修饰符,则该类只在当前包可见,不可以使用private和protected修饰类。
继承是面向对象的三大特性之一,是Java中实现代码重用的重要手段之一。Java中只支持单继承,即每个类只 能有一个直接父类。继承表达的是is a的关系,或者说是一种特殊和一般的关系,如Dog is a Pet。
2.重写和继承关系中的构造方法
1.子类重写父类方法
在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖。方法重 写必须满足如下要求:
1.重写方法和被重写方法必须具有相同的方法名。
2.重写方法和被重写方法必须具有相同的参数列表。
3.重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。
4.重写方法不
能缩小被重写方法的访问权限。
问题:重载和重写有什么区别和联系?
解答:重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型,访问修饰符无关。
重要涉及的是子类和父类之间的同名方法,要求方法名相同,参数列表相同,返回值类型相同(或是其 子类),访问修饰符不能严于父类。
super代表对当前对象的直接父类对象的默认引用。在子类中可以通过super关键字来访问父类的成员。
00
1.super必须出现在子类(子类的方法和构造方法)中,而不是其他位置。
2.可以访问父类的成员,如父类的属性,方法,构造方法。
3.注意访问权限的限制,如无法通过super访问private成员。
2.继承关系中的构造方法
继承条件下构造方法的调用规则如下:
1.如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示 调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,有没 有“super()”语句,效果都是一样的。
2.如果子类的构造方法中通过super显示调用父类的有参构造方法,则将执行父类相应的构造 方法,而不执行父类无参构造方法。
3.如果子类的构造方法中通过this显示调用自身的其他构造方法,则在相应构造方法中应用 以上两条规则。
4.特别注意的是,如果存在多级继承关系,则在创建一个子类对象时,以上规则会多次向更 高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
3.抽象类
1.抽象类和抽象方法
抽象类不能实例化
抽象类和抽象方法的特点:
1.抽象类和抽象方法都通过abstract关键字来修饰
2.抽象类不能实例化。抽象类中可以没有,有一个或多个抽象方法,甚至全部方法都可以时 抽象方法。
3.抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重 写所有的抽象方法才能实例化,否则子类还是一个抽象类。
注意:1."public void print(){}"不是抽象方法,而是有实现但是实现为空的普通方法。
2."public abstract void print();"是抽象方法,别忘记最后的分号。
3.abstract可以用来修饰类和方法,但不能用来修饰属性和构造方法。
问题:抽象类中可以有构造方法吗?
解答:抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是由private修 饰,也可以被本类的子类中的构造方法调用。
4.final修饰符
1.final的应用
1.用final修饰的类,不能再被继承。
2.用final修饰的方法不能被子类重写。
3.用final修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次。
注意:1.final和abstract是功能相反的两个关键字,可以对比记忆。
2.abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。final可以用来修饰类,方法和属 性,不能修饰构造方法。
3.Java提供的很多类都是final类,如String类,Math类,它们不能再有子类。Object类中一些方法, 如getClass(),notify(),wait()都是final方法,只能被子类继承而不能被重写,但是hashCode (),toString(),equals(Object obj)不是final方法,可以被重写。
'
5.常见错误
1.final修饰引用型变量,变量所指对象的属性值是否能改变?
请找出下面程序中存在错误的位置
class Dog{
String name;
public Dog(String name){
this.name = name;
}
}
class Test{
public static void main(String [] args){
final Dog dog = new Dog("欧欧");
dog.name = "美美";
dog = new dog("亚亚");
}
}
对于引用型变量,一定要区分对象的引用值和对象的属性值两个概念。使用final修饰引用型变量,变量不可以再指向另外的对象,所以"dog = new Dog("亚亚");"是错误的。但是所指对象的内容却是可以改变的,所以"dog.name = "美美";"是正确的。
结论:使有FINAL修饰引用型时,变量的值是固定不变的,而变量所指向的对象的属性值是可变的。
2.abstract是否可以和private,static,final共用?
结论:abstract不能和private同时修饰一个方法。
abstract不能和static同时修饰一个方法。
abstract不能和final同时修饰一个方法或类。
5.综合练习:实现汽车租赁系统的计价功能
分析:面向对象设计的过程就是抽象的过程。先通过在需求中找出名词的方式来确定类和属性,通过找出动词的方式来确定方法。然后对找到的词语进行筛选,剔除无关,不重要的词语,还要对词语之间的关系进行梳理,从而确定类,属性,属性值和方法。
设计分以下五步:
第一步:发现类
第二步:发现类的属性
第三步:发现类的方法
第四步:优化设计
第五步:梳理运行过程