【Java】面向对象(二)继承

来源:互联网 发布:最后的舞者 知乎 编辑:程序博客网 时间:2024/06/05 06:14

【继承】

a: 继承概念

* 当一个类的属性与行为均与现有类相似,属于现有类的一种时,这一个类可以定义为现有类的子类。  
* 子类的访问权限要比父类的访问权限大或者相同,返回值类型为引用数据类型时要相同或者子类小。
* 子类具有父类的非私有属性与方法。无需重新定义,可以直接调用。
* 在有了父类这个模板之后,所有的类在继承后便均是该类型的一种,具备这种类型基本的属性与行为。

 b: 继承格式

class 子类 extends 父类{
//父类的非私有方法与属性均继承过来
}

 c: 继承目的

提高代码复用性

 d: Java中的继承规则

* Java只支持单继承,不支持多继承。即只能有一个父类,Object类是所有类的祖宗类。
* 父类可以继续有父类。
* 只有Object类没有父类。 里面有to String 方法

* 子类不能访问父类中的私有成员,但是私有成员可以通过公共方法得到访问。


【方法重写】

a: 概念

* 当子类继承父类后,拥有了父类非私有的方法并可以直接调用。
但是子类可以按照子类自身的逻辑重新定义继承过来的父类方法,该过程叫做方法重写。

 b: 方法重写格式

* 子类中定义与父类一样的方法便将父类的方法覆盖了。

 d: 方法重写规则

* 访问权限相同或子类方法更大
* 方法名称必须相同
* 参数列表必须相同
* 返回值为基本类型时必须相同
* 返回值为引用类型时相同或子类小

e: 重写与重载的区别:

      重写:

        0.方法名和形参列表完全一致
        1.子类的方法的权限>=父类方法的权限
        2.返回值:
            a.如果是基本数据类型,子父类必须一致
            b.如果是引用数据类型,子类的类型<=父类的类型

      重载:

        0.方法名相同

        1.形参顺序 或 形参类型 或 形参个数 不同


 

【抽象类】

a: 说明

* 在抽取交通工具父类的过程中我们发现真正传入方法的一般情况均为交通工具的子类对象。
父类本身很少甚至根本不会直接创建对象,这时,我们可以将父类设计为抽象类。
* 抽象类即不能创建实例的类型,仅用来描述一种类型应该具备的基本特征与功能。

b: 概念

* Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
* 抽象类用来描述一种类型应该具备的基本特征与功能,例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。
而犬科描述了所有的犬科子类应具备的属性和行为。
* 具体如何去完成这些行为由子类通过方法重写来完成,如:狼和狗都有吼叫的方法,可是吼叫内容方式不同。
所以抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。

c: 抽象定义格式

* 使用abstract修饰抽象类与抽象方法
//abstract在class前修饰类
//abstract在访问权限后,返回值类型前修饰方法,方法没有方法体。
如:
abstract  class  Person {
public abstract void  eat();
}

 d: 抽象类&抽象方法的使用

* 抽象类无法直接创建对象,只能被子类继承后,创建子类对象。
* 子类定义时继承抽象类
* 抽象类是事物的描述,子类需要继承父类完成最终的功能实现细节(即重写方法,完成方法体)。
* 将一个抽象方法重写的过程也叫实现方法的过程。
* 子类定义后创建实例对象
* 在定义好子类后,可以直接创建对象。在所有使用子类的地方可以传入子类对象,
在所有使 用父类的地方也可以传入子类对象(接收的是父类类型,但是调用方法时传入的可以是子类类型),
因为属性与方法在子父类中都是相同的。
* 在使用父类型的地方,均可以给予其子类对象!!!!

 e: 注意事项:

a.如果一个类含有抽象方法,该类一定是抽象的
b.如果没有含有抽象方法,也可以把该类定义为抽象的,纯粹为了不想让该类创建对象   


【接口】

a: 概念

* 接口是功能的集合,是比抽象类更为抽象的类,同样是一种数据类型。
* 接口的更为抽象表现为其内的所有方法均为抽象方法。同时不定义普通的成员变量。
* 使用时,接口同样不能创建对象,只能在定义时实现接口。接口只能实现,不能继承。实现的动作类似继承,只是关键字不同,实现使用implements。
* Java支持继承一个类的同时实现多个接口。
* 像父类一样,所有定义接口的地方,也可以传入其实现类对象(子类对象)。

b: 其他细则

* Java支持一个类同时实现多个接口。
* 接口可以继承接口。
* 类可以在继承一个类的同时,实现多个接口。
* 接口与父类的功能可以重复,均代表要具备某种功能。
* 接口中的成员是固定的:
* 变量修饰符为:public static final(static与final明天讲解)
* 方法修饰符为:public abstract(所以重写接口方法时,必须使用public)

 c: 定义格式

使用interface代替了原来的class,其他步骤与定义类相同。
public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
如:
public interface Careable {
public abstract void carCare();
}

 d: 使用格式

   在具体定义类时实现接口,必须重写(实现)所有抽象方法或者定义抽象类,定义抽象类可以留下若干抽象方法不实现。
class 类 implements 接口1,接口2{}
 如:
class Tesla implements  Careable {
public void carCare() {
System.out.println(“不去汽车保养店,去专业Tesla保养店!”);
}

}


实例:

已知动物类(姓名,年龄,吃饭,睡觉),它有两个子类,分别是猫类和狗类。
不同的是猫吃鱼,狗吃肉。
经过马戏团的培训后,部分猫会跳高,部分狗也会跳高。
请写代码实现。

定义抽象类:Animal

<strong>public abstract class Animal {private String name;private int age;public abstract void eat();public void sleep(Animal an){System.out.println(an.getName()+"睡觉觉");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}</strong>



定义猫类、继承Animal
<strong>public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}}</strong>


定义狗类、继承Animal
<strong>public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}}</strong>



定义Jump带参接口(将动物名作为参数传到jump方法中)
<strong>public interface Jump {public abstract void jump(Animal an);}</strong>


定义马戏团类实现Jump接口
<strong>public class MaXiTuan  implements Jump {@Overridepublic void jump(Animal an) {System.out.println(an.getName()+"在马戏团里会跳了");}}</strong>

源码可能显示不全:点击图片位置即可查看源码


1 0
原创粉丝点击