我是靠谱客的博主 英俊草莓,这篇文章主要介绍从零开始学Java(八) 继承java继承的特性方法覆盖的条件注意事项多态,现在分享给大家,希望可以做个参考。

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(八)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(132)

评论列表共有 0 条评论

立即
投稿
返回
顶部