Java教程

JAVA-继承和多态

本文主要是介绍JAVA-继承和多态,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

什么是继承(extends)

一个类继承另外一个类,该类就可以使用父类的属性和方法

继承的好处

好处:

减少代码,提高开发效率,提供代码复用性

缺点:

增加了类之间的耦合性

只能单继承

开发原则:

高内聚低耦合

继承的特点

1.关键字extends

2.类只能单继承A extends B

称A为子类,B为父类

PS:一般以sub做子类名,sup做父类名

3.支持多层次继承

A extends B,B extends C

A类对象可以使用C类中的属性和方法

4.类如果没有显示继承其他类,默认继承Object

Object 是所有类的超类(superclass)

5.子类只能使用父类非私有的属性和方法

继承的注意事项

单继承

只能调用非私有属性和方法

继承中的成员变量的使用

父类有成员变量,子类没有

子类可以直接使用父类该成员变量(前提:非私有变量)

父类有成员变量.子类有同名成员变量

子类默认使用自己的成员变量

父类没有,子类有成员变量

只能调用自己的成员变量

继承中的成员方法的使用

父类有成员方法,子类没有

子类可以直接使用父类该成员方法(前提:非私有变量)

父类有成员方法,子类有同名成员方法>重写/覆写

子类默认使用自己的成员方法

---

子类有与父类同名的方法.但是还是想使用父类方法执行

可以使用super.方法()调用父类方法

父类没有.子类有成员方法

只能调用自己的成员方法

重写

出现在继承中,子类重写父类的方法

重写的目的

使用父类的方法名,参数列表,但是方法体内部具体不一样,达到适应子类自己的运行场景的情况

重写的特点:

1.子类重写父类方法

子类方法的访问修饰符>=父类的访问修饰符权限

返回值类型与父类的一样

方法名要与父类一样

参数列表(个数,顺序,类型)与父类一样

子类抛出的一次范围<=父类的异常范围

方法体不一样

继承中的构造方法的使用

1.子类不能调用父类构造方法(子类自己的对象也不能调用自己构造方法)

构造方法只能new来调用

2.在任意一个构造方法中第一行隐式存在super()店员父类无参构造

super 和 this

this:代表调用方法的当前对象,this属性,调用子类自己的属性,当自己没有时,也可以调用父类的属性

this.方法()调用子类自己的方法,当自己没有时,也可以调用父类的方法

this()只能调用子类自己的方法

super

代表当前方法的对象的父类对象

super.属性,只能调用父类的属性

super,方法() 只能调用父类的方法

super() 只能调用父类的构造方法

特点:

1.在任意一个构造方法中第一行隐式存在super()调用父类无参构造

2.this和super在构造方法中不能同时出现

是因为:调用构造方法的语句必须在构造方法的第一行

继承和多态

一,继承

面向对象三大特征:封装,继承,多态

java中的继承其实类似于生活中的继承.子类可以使用父类的一些属性和方法.

两个类通过一个关键字extends,体现两个类的继承关系.

A extends B

A 是子类,B是父类

A继承B,A就可以调用B的一些属性和方法

java中是 单继承,一个类只能一个自己父类.

假设一个类必须继承两个类,怎么办?

A继承B,B继承C.

方法的重置:

概念:在同一个类中,两个方法的名字一样,参数列表不一样

方法得到重写

概念:子类中的方法与父类中的方法一致.

如果父类的方法不能满足子类的需求,就需要在子类中重写

重写还有别的用处,例如旧代码已经不能满足新的需求,怎么办?

什么时候使用重写?

1.如果有很多子类,为了统一,可以写一个父类,编写方法,让这些子类继承,同时重写父类的方法即可,如果父类的,某些方法所有子类都可以使用,那么这些方法是不需要重写的

2.上面的黑体字

注意事项

重写要求返回值是一致的,重载对返回值没有要求

public int abc(){

}

public void abc(){

}

在同一个类中是重载

而不是重写,返回值不一样

super:

访问父类的属性和方法,但不能访问私有的

还有一个作用,就是调用父类的构造函数,包括有参和无参的

为什么要调用父类的构造函数?

为了节省代码

注意:

 如果调用父类的构造函数,那么父类的构造函数必须在函数体的第一行。

实例化对象的时候肯定是先实例化父类,再实例化子类。

如果父类的构造函数放在后面,那么意味着先实例化子类,后实例化父类。

与上面这句话是违背的。

进入子类的构造函数开始实例化子类,然后先调用super()来实例化父类,并且给父类的属性赋值。然后再回来继续实例化子类,给子类的属性赋值。

当代码全部执行完毕,子类才实例化完毕。

内化

一、 Object

Object默认情况下是所有类的父类。这个类很特殊,我们并没有显示的继承Object,但是它仍然是所有类的父类。

Object 定义了很多方法,这些方法在子类中很多时候都会被重写

拿最常用的equals()  来说。

object 中的equals() 对比的是两个对象的内存地址

二、 String 的equals()

对比的字符串的内容是否一样

我们可以猜测,String的equals是重写了父类的equals方法

首先对比了内存地址

为什么要对比内存地址?

因为两个字符串如果内存地址一样,那么内容一定是一样的。

如果内存地址不一样,则对比内容

怎么对比内容?

把字符串编程 char[]数组,然后遍历数组,进行字符的一个一个的对比。

递归:

自己调用自己叫做递归(一般慎用)

三、 toString()方法

什么时候使用 toString()?

不想打印对象的内存地址,想打印对象中各个属性的值的时候用。

四、 hashCode()

根据对象的一些值(内存地址,属性的值等),作为基数进行运算,最终得到一个固定长度的值。

进行什么运算?

这里调用的是本地的 hashCode()

也就是说调用的是本操作系统的hashCode()方法。

hashCode() 的厉害之处在于,任意长度的数字运算完毕后,得到的结果的长度是固定的。

有什么用?

方便快速定位(查找)对象的位置。

五/转型

转型分为向上转型和向下转型

类似八大基本类型之间的转型

1.向上转型:子类引用,转型成父类引用

映射

2.向下转型:父类引用,转型成子类引用

向上转型的缺点:

向上转型后,只能调用父类中定义的方法,不能调用自己个性化的方法.

当我们需要调用自己个性化的方法时候,就要向下转型.

这么做的目的是不想躺程序出错

六/多态

同一个引用类型,使用不同的实例而执行不同的操作

能不能用一个方法来代替上面所有的cure方法?

多态解决

观察规律,会发现所有cure方法参数共享一个父类

Person / Cat/ Monkey共有父类是Animal.

所以,我可以定义一个方法,参数数Animal

那么这样就可以用一个方法代替以上所有的方法.

这篇关于JAVA-继承和多态的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!