java继承的特性
①
B
类继承
A
类,则称
A
类为超类
(superclass)
、父类、基类,
B
类则称为子类
(subclass)
、派生类、扩展类。
②
java
中的继承只支持单继承,不支持多继承,
C++
中支持多继承,这也是
java
体现简单性的一点,换句话说,
java
中不允许这样写代码:
class B extends A,C{ }
。
③ 虽然
java
中不支持多继承,但有的时候会产生间接继承的效果,例如:
class C
extends B
,
class B extends A
,也就是说,
C
直接继承
B
,其实
C
还间接继承
A
。
④
java
中规定,子类继承父类,除构造方法和被
private
修饰的数据不能继承外,剩
下都可以继承。
⑤
java
中的类没有显示的继承任何类,则默认继承
Object
类,
Object
类是
java
语言
提供的根类(老祖宗类),也就是说,一个对象与生俱来就有
Object
类型中所有的特征。
⑥ 继承也存在一些缺点,例如:
CreditAccount
类继承
Account
类会导致它们之间的
耦合度非常高,
Account
类发生改变之后会马上影响到
CreditAccount
类。
public class OverWrite
{
public static void main(String[] args){
Chinese cp = new Chinese();
cp.setName("tanbei");
cp.speakHi();
American ap = new American();
ap.setName("yoda");
ap.speakHi();
}
}
class People
{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public void speakHi(){
System.out.println(this.name+"speak Hi!");
}
}
class Chinese extends People
{
public void speakHi(){
System.out.println(this.getName()+"说你好!");
}
}
class American extends People
{
public void speakHi(){
System.out.println(this.getName()+"say hello!");
}
}
方法覆盖的条件
① 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
② 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表;
注意事项
① 由于覆盖之后的方法与原方法一模一样,建议在开发的时候采用复制粘贴的方式,不建议手写,因为手写的时候非常容易出错,比如在
Object
类当中有
toString()
方法,该方
法中的
S
是大写的,在手写的时候很容易写成小写
tostring()
,这个时候你会认为
toString()
方法已经被覆盖了,但由于方法名不一致,导致最终没有覆盖,这样就尴尬了;
② 私有的方法不能被继承,所以不能被覆盖;
③ 构造方法不能被继承,所以也不能被覆盖;
④ 覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高;
⑤ 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少;
⑥ 方法覆盖只是和方法有关,和属性无关;
⑦ 静态方法不存在覆盖
;
多态
必要条件:
① 继承
② 方法覆盖
③ 父类型引用指向子类型对象
多态的代码表现是父类型引用指向子类型对象,对于多态的理解一定要分为编译阶段和运行阶段来进行分析,编译阶段只是看父类型中是否存在
要调用的方法,
如果父类中不存在,则编译器会报错,编译阶段和具体
new
的对象无关。
但
是在运行阶段就要看底层具体
new
的是哪个类型的子对象了,
new
的这个子类型对象可以看做
“真实对象”,自然在运行阶段就会调用真实对象的相关方法。
例如代码:
Animal a = new Cat();
a.move();
,在编译阶段编译器只能检测到
a
的类型是
Animal
,所以一定会去
Animal
类中找
move()
方法,如果
Animal
中没有
move()
方法,则编译器会报错,即使
Cat
中有
move()
方法,也会报
错,因为编译器只知道
a
的类型是
Animal
类,只有在运行的时候,实际创建的真实对象是
Cat
,
那么在运行的时候就会自动调用
Cat
对象的
move()
方法。
这样就可以达到多种形态,也就是说
编译阶段一种形态,运行阶段的时候是另一种形态。这也就是多态的含义。
public class Pet
{
String name;
public void eat(){
}
}
public class Cat extends Pet
{
public Cat(String name){
this.name = name;
}
public void eat(){
System.out.println(this.name+"在吃鱼!");
}
}
public class Dog extends Pet
{
public Dog(String name){
this.name = name;
}
public void eat(){
System.out.println(this.name+"在吃骨头!");
}
}
public class Master
{
public void feed(Pet pet){
System.out.println("主人开始喂食");
pet.eat();
System.out.println("喂食完毕");
}
}
public class Test
{
public static void main(String[] args){
Dog dog = new Dog("小狗");
Cat cat = new Cat("小猫");
Master master = new Master();
master.feed(dog);
master.feed(cat);
}
}
最后
以上就是英俊草莓最近收集整理的关于从零开始学Java(八) 继承java继承的特性方法覆盖的条件注意事项多态的全部内容,更多相关从零开始学Java(八)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复