Java基础5:继承、方法重写和多态

1 特点:extends关键字

1 单继承:

一个类只能有一个直接父类;多重继承,一个类可以有多个间接父类:父类、祖父类。。。

如果定义一个Java类时候,没有显式指定这个类的直接父类,则默认扩展java.lang.Object类。

子类扩展了父类,子类是一个特殊的父类。多数情况下,子类在父类的基础上新增成员变量和方法。有一种例外:子类重写父类的方法。

子类不能继承父类的private成员(属性,方法)。

如果父类方法具有private访问权限,则该方法对子类是隐藏的,子类无法访问,也无法重写该方法。

2 定义:

public class 父类 {

}

public class 子类 extends 父类 {

}

子类中:可以增加变量、增加方法或覆盖父类的方法

3 构造器

当调用子类构造器来初始化子类对象时:先初始化父类构造方法,再初始化子类构造方法。

创建本类对象之前会先初始化父类对象(因为子类可能用到父类属性,所以要先初始化父类)

如Object->Class A->Class B,当创建class B对象时候:

系统先执行Object类的构造器,再执行class A的构造器,然后才执行class B的构造器。

4 访问修饰符:public>protected>默认修饰符>private

1 Private:仅对本类可见

2 Default:对本包可见

3 Procted: 对本包和所有子类可见

4 Public:对所有类可见

2 方法重写Override:子类对父类方法的升级或改造。通过继承或实现接口两种方式。

1 子类中包含与父类同名方法的现象叫做重写。子类重写/覆盖了父类的方法。

修饰符、返回值、方法名、参数都必须一模一样。

两同两小一大:

两同:方法名相同,形参列表相同

两小:子类方法返回值类型<=父类方法返回值类型;子类抛出异常<=父类方法声明抛出的异常类

一大:子类访问权限>=父类访问权限。

如果一个方法是protected:很大可能告诉别人,这个方法是给子类重写用的。

2 子类

方法重写在eclipse中的快捷键:alt+/ 双击

会自动带上注解@Override,表明此方法是一个重写方法。如果不满足重写要求,会报错,可校验重写方法正确与否。

3 子类中重写了父类方法,则调用时一定调用的是子类重写过的方法。

子类覆盖父类方法后,如果想调用父类中被覆盖的方法:super关键字

设计类时:要将通用的方法放在父类中,而降特殊用途的方法放在子类中

4 super:

关键字:一般只在重写里用到

1 Super指向父类: 调用父类方法或属性。

this指向当前类:区分局部变量和成员变量同名

this/ super:不能出现在static修饰的方法中。

2 super/this必须出现在构造方法的第一行:所以super/this在构造方法里不会同时出现。

super() 调用父类构造方法

this() 调用本类其他构造

3 如果某成员变量只在父类中存在,在子类中不存在:在子类实例方法中访问该成员变量时,无需显式使用super或父类名。

某个方法中访问名为a的成员变量,但未显式指定调用者,系统查找a的顺序为:

1)该方法中是否有名为a的局部变量;

2)当前类中是否有名为a的成员变量;

3)a的直接父类中是否有名为a的成员变量,向前追溯a的所有父类,直至Object。如果一直没有,报编译错误。

3 final

1 final类:不能被继承

final类中的所有方法都隐式指定为final方法,因为不会有子类,也就不会被重写。

2 final方法:不能被重写(禁止覆盖)

3 final常量:

-一个永不改变的编译时常量:既是static又是final,一般用大写表示,并且用下划线分隔各个单词, e.g.: public static final double PI = 3.1415926

-一个在运行时被初始化的值,且不希望它的值被改变, e.g.: private final int period = 3;

4 所有类的超类:Object

1 如果某类没有明确指出父类,那么默认该类继承自Object类;

2 equals()方法:比较两个对象是否相等

如果两个对象指向同一块内存区域,方法返回true;否则返回false

1 public static boolean equals(int[] a, int[] a2)

如果两个数组长度相同,并且对应位置上数据元素也相同,则返回true

2 public static boolean equals(Object a, Object b) {

return (a == b) || (a != null && a.equals(b));

}

如果a和b都为null,返回true;如果只有一个为null,返回false;否则返回a.equals(b)

3 如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。

Java对于eqauls方法和hashCode方法是这样规定的:

(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;

(2)如果两个对象的hashCode相同,它们并不一定相同

4 toString()方法:返回表示对象值的字符串

在自定义的类中,应该要重写、覆盖toString()方法

public String toString() {

return getClass().getName()

+ "[name=" + name

+ ", salary=" + salary +"]";

}

5 多态

1 用父类的类型来接收子类的对象:

父类 对象名 = new 子类名(); //实际上new的还是子类对象。

多态:父类类型Animal接收子类对象Cat/Dog类

Animal a2 = new Cat();

Animal a3 = new Dog();

animalEat(a2);//Cat eat

animalEat(a3);//Dog eat

2 先决条件:

继承/接口实现

父类类型接收子类对象

3 优点:

扩展性强,解决了代码复用,降低类型耦合度

可以少定义变量,少些重复代码。

案例:一个方法接受不同的子类类型。

4 缺点:

不能使用子类特有方法

可以使用强转,转成对应子类类型,解决这个问题。

使用方法:

父类 变量名1 = 子类对象;

子类 变量名2 = (子类)变量名1;

多态一般伴随重写使用。

e.g: Animal a = new Cat();

Cat cat = (Cat)a;

cat.catchMouse();

如果没有继承关系,就不能强转,classCastException

6 继承的设计技巧

1 将公共操作和域放在超类

2 不要使用procted域,Procted方法一般用来不提供用途而在子类中重新定义的方法

3 任何时候只要使用了以下条件,就应该考虑使用多态:为这个概念定义一个方法,并将其放在两个类的超类或接口中,就可以调用:x.action()

if(x is type 1)

action1(x)

else if (x is type 2)

action2(x)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值