java 随笔 继承

继承
面向对象继承性
一个良好的程序设计,不仅要方便维护,还要可提高代码的可重用性。利用继承可以实现类机构的重用定义。
结构如下:
class 子类 extends 父类{}
很多情况下,在继承结构中,也将子类称为 派生类, 父类称为 超类(SuperClass)。
继承实现的主要目的是子类可以重用父类中的结构,同时可以根据子类功能的需要进行结构扩充,所以子类的描述范围比父类更小。

子类对象的实例化流程:
在继承结构中,子类需要重用父类中的结构,所以子类在进行对象的实例化时往往都会默认调用父类中的构造方法,为父类对象实例化,而后再进行子类构造的调用,为子类对象实例化。
实际上,在子类的构造方法里隐含调用一个super()方法,而且是在子类构造方法里的首行。

情景理解:程序源于生活,我们每个人都有父母,父母一定出生比我们早,实例化就表示对象的出生,所以在子类出生前(实例化),父类对象一定要先出生(在子类的构造器中首行默认调用父类构造方法)。

继承的限制:

  1. java中子类只能有一个父类。
    Java语言中,只能够单继承,可以多层继承(a继承b,b继承c),但是不可以多重继承。
    (程序源于生活,可以这样理解,一人只能有一个亲生父亲,只能有一个亲爷爷。)
    2.对于所有的非私有的属性,可以直接通过对象操作(显式继承),而所有私有的属性,可以间接完成(隐式继承,getter方法,隐式访问)。

覆写
在继承关系中,父类最为最基础的类存在,其定义的结构都是为了完成本类的需求所设计的,但在很多时候由于一些特殊需要,子类有可能会定义与父类名称相同的方法或属性,此类情况在面向对象设计中被称为 覆写。
在继承结构中,子类可以继承父类中的全部方法,当一些方法无法满足子类的设计时,就可以针对自身的需求进行方法的扩充,覆写的方法,其名称,返回值类型,参数类型及个数,与父类完成相同。
问题 : 子类中如何调用已经被覆写过的方法呢?
答: 可以通过关键字,super.方法();的形式调用父类中已经被覆写的方法。

方法覆写有没有限制?
答:有,被子类所覆写的方法不能比父类拥有更小的访问权限。(如:private < default … <public )。注意,在父类方法是private修饰时,其子类无法覆盖这个方法!

上面说到的都是对于方法的覆盖,下面介绍如何覆盖属性,及属性覆盖时的限制要求等:
子类可以依据自身需要,对父类中的属性进行重名定义,即属性的覆盖,但只能对使用了非private属性的覆盖,只要名称与父类的一致就行,与属性的类型无关。

*This 与super 的区别
序号 区别 this super
1 定义 表示本类对象 表示父类对象
2 使用 本类操作:this.属性、this.方法()、this() 父类操作:super.属性、super.方法()、super()
3 调用构造 调用本类构造,放在首行 子类调用父类构造,放在首行
4 查找范围 本类查找,在子类找不到再去查找父类 直接由子类查找父类
5 特殊 表示当前对象

*方法重载,与覆写的区别
重载与覆写严格意义上说是面向对象的多态性的一种形式
序号 区别 重载(overLoading) 覆写(overRiding)
1 定义 方法名称相同,参数类型个数不同,与返回值无关 方法名称、类型、个数、返回值相同
2 权限 无权限要求 子类的权限一定不能拥有比父类更加严格的访问控制
3 范围 发生在一个类中 发生在继承关系中

Final关键字
为了保护父类,java提供了final关键字,使用其可以实现以下功能:
1:定义不能被继承的类。(String类其实就是被final修饰)
2:定义不能被覆写的方法,定义常量(类中的全局常量)。
对于修饰常量的时候,一般要求常量名称全部大写。

面向对象多态性
展现形式一:方法的多态性(同样的方法的不同实现)
上面介绍方法的重写,和覆写的时候已经说过了,其实这两种属于方法多态性的展现。
展现形式二:对象的多态性(父类子类之间的转换处理)
对象向上转型: 父类 父类的实例 = 子类实例 (自动完成);
对象向下转型: 子类 子类的实例 = (子类)父类的实例 (强制转换)。

**注意:必须先发生向上转型,之后才可以进行向下转型
在对象的向下转型时,父类实例是不可能强制转换为任意子类,必须通过子类实例化,先利用向上转型,让父类与具体子类之间发生联系,才可以向下转型,否则会出现ClassCastException

Instanceof关键字
为了保证向下转型的安全,java提供了instanceof关键字。

父类             子类

如:person p = new superPerson();
If(p instanceof superPerson){ // 判断确定是子类的实例 则可进行强制转换
superPerson sp = (superPerson) p
}

如果p对象的引用是null,则返回false.

Object类
Object类是java中所有类的父类,在java语言中,为了方便操作类型的统一,为了方便每一个类的定义一些公共操作,所以专门设计了object(是所有类的父类,但其没有父类)。
Object.tostring()方法
源码:
Public string tostring{

Return getclass.()getName() + “@” + Integer.toHextString(hashCode);
}

此方法利用反射和对象编码获取对象信息。
该方法在对象输出是,默认直接调用
如:person p =new person();
System.out.println§; //此时输出对象信息时,默认调用tostring方法。
对象的比较(equals()方法)
如何比较2个对象的内容完全相同呢?假如有2个Person对象,这2个对象分别用new 开辟了堆内存空间,所以想要确认内容相同,那就需要逐个比较属性,对于这样的比较Object类提供了一个标准方法 : public boolean equals(Object obj)。

而object类中考虑到设计的公共性,其equals()方法中,两个对象的比较,是基于地址数值判断的(对象 == 对象),如果子类有需求,那么需要覆写此方法。
提示:String类是Object的子类,其下面的equals方法也是覆写了Object中的方法。

范例: 子类覆写Object中的equals方法
Class person extends object {

Private String name;
Private int age;
Public Person(String name,int age){
This.name = name;
This.age = age;
}

//开始覆写equals方法
Public boolean equals(Object obj){ // 返回布尔类型
If( !(obj instanceof Person)){
Reutrn false; //实例类型判断,因为下面要用到强制转换,需要将object转换到本类的一个实例
}

If(this == obj){ //对象的地址相同,那么内容肯定相同
Return true;
}

Person per =( Person) obj ; // 强制向下转型

Return this.name.equals(per.name ) && this.age == per.age // 这里的equals 是string 的覆写方法,age 是int 类型,用== 判断就行。

}

}

概要:
1.继承可以扩充已有类的功能,通过extends 关键字实现,可将父类的成员(包含数据成员和方法)继承到子类。
2.Java 在执行子类的构造方法之前,会先默认调用父类的无参构造,其目的是为了对继承父类的成员做初始化操作,当父类实例化后,才调用子类的构造方法。
3.在子类中,想调用父类的构造方法,可以通过super() 方法来完成。
4.This()是在同一类中调用构造方法,而super()是从子类中直接调用父类的构造。
5.继承关系中,使用this调用属性和方法时,先从子类查找,如果未发现,则会从父类中查找。而super的话, 直接在子类中去父类查找属性或方法。
6.This() 和super() 调用构造方法的相似之处: 他们会根据输入的参数类型和个数,调用不同的构造方法;二者都必须写在构造方法的第一行!!!所以,一山难容二虎,他俩无法同时存在一个构造器中。
7.“重载”是用在一个类中!!,方法的名称相同,参数类型及个数不同,与返回值无关,因此java可以依据,参数类型和个数调用不同的方法。
8.“覆写”是发生在继承关系中!子类和父类中的方法的名称相同,参数类型个数相同,返回值相同。
9.如果,父类不希望其中的方法被子类覆写,只需在方法或属性前加上final关键字。
10.Final用在属性前,即表示全局常量无法修改。
11.对象的多态性主要表现在转型,为防止出现转换异常classcastexception,可以在强制转换时使用instanceof来对实例类型判断
12.所有的类都继承与Object,所以,引用数据类型都可以向上转型到object类型,利用object可以实现方法接受参数或返回类型的统一。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值