Javaoop3

继承

继承是面向对象的第二大特征,下面来具体看看继承
1.概念
把子类相同的属性和方法提取出来,放到父类中,让子类继承父类
2.特点
1)使用extends关键字

2)Java中继承的特点:只能单继承(只能有一个直接父类)

3)什么时候使用继承?子类和父类是”is a”的关系的时候,不要为了部分代码去继承,比如狗是一个动物,那么狗就有动物的共有属性

4)不继承父类的有哪些?
1.私有的(即父类private修饰的成员)
2.父类的构造方法
3.子类和父类不在同一个包中,默认访问权限修饰的成员

5)super关键字(在Java中子类可以和父类有相同的属性,用super调用父类的)
super.属性
super.方法
super()(子类的构造方法中访问父类对应参数的构造方法,必须是第一句)

注意:初学者可能感觉这个很奇怪,为什么子类不能继承父类的构造方法,为什么又要调用父类的构造方法,为什么super要在第一句。。。等诸多限制。
我刚学的时候从一个人的博客上找到一段,但很遗憾现在找不到原文了,我总结了一下,加上我的理解

首先第一个问题,构造方法的定义 是与类的名称相同;如果子类能够继承父类的构造方法;那么在子类的构造方法中就有不同于子类名称的构造法;
这与构造方法的定义不符;所以子类是不能继承父类的构造方法的;

为什么又要调用父类的构造方法?为什么super要在第一句?
子类继承父类,必须在子类的构造函数中调用父类的构造函数,如果子类得构造函数中,没有显示的调用,那么会自动调用父类的无参数构造函数,如果父类没有无参数构造函数,那么子类中必须显示的调用父类的构造函数。
究其原因,想必是 Java 语言设计者,要求子类有责任保证它所继承的父类尽快进入到一个稳定、完整的状态中。试想,如果没有这个约束,那么子类的某个继承自父类的方法可能会使用到父类中的一些变量,而这些变量并没有进行初始化,从而产生一些难以预料的后果,因此构造子类的对象前,必须构造父类的对象,并将之隐含于子类对象之中,使用关键字super引用父类对象。
也因此,当一个类的构造方法是 private 时,它是不可被 extends 的,因为子类构造方法难以调用到这个父类的构造方法。

方法重写

子类根据需求对继承的方法进行重新编写
重写时可以用super.方法的方式保留父类的方法
要求重写的方法参数相同,如果不同不是重写,是重载,只是在子类内部自己写的方法,如果仍然父类引用指向子类,调用父类对应方法
@override 表示方法是重写的

关于方法重写,上面只是基本的理解,想要更深的体会就要代码实践了

方法重写的具体要求:
(1) 方法名相同;
(2)参数列表相同;
(3)返回值类型相同或者是其子类;
(4)访问权限不能严于父类;
(5)父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法;
(6)子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法;
(7)父类的私有方法不能被子类覆盖;
(8)不能抛出比父类方法更多的异常正确使用方法的重写或覆盖

方法重载和方法重写的区别:
这里写图片描述

重写是一个非常重要的概念,通过重写可以扩大子类的功能,应该充分理解应用。
下面介绍Java中一个特殊的类:

Object类

他是所有类的父类,他有几个常用方法,经常被子类重写调用:

这里写图片描述
hashCode 方法返回hash码值,默认情况下,一个对象的hash码值是唯一的,可以认为是地址变换而来

在Java中,class这个类用来描述每个类的信息
Class clz=dog.getClass(); //获取描述Dog类信息的对象
Dog d=(Dog) clz.newInstance();//通过clc创建一个Dog对象
d.show();//clc包含了Dog类的所有属性

`package jicheng;

public abstract class Animal {

public String type;
public String voice;
public abstract void shout();

}
package jicheng;

public class Dog extends Animal{

public static void main(String[] args) {


    Dog d=new Dog();
    d.shout();

}

@Override
public void shout() {
    System.out.println("汪汪汪");

}

}
package jicheng;

public class Wolf extends Animal {

@Override
public void shout() {
    System.out.println("哇呜");

}
public static void main(String[] args) {

    Wolf w=new Wolf();
    w.shout();
}

}
package jicheng;

public class Cat extends Animal{

@Override
public void shout() {
    System.out.println("喵");

}
public static void main(String[] args) {

    Cat c=new Cat();
    c.shout();
}
}

`
上面的代码中,我使用了三个类,cat,dog,wolf,继承animal类,在animal类中实现了定义了抽象方法shout,上面的例子就是一种简单的继承与方法重写,通过继承,我们可以避免重复代码的实现,通过方法重写,我们可以实现子类需要扩展的继承自父类的功能。

这节就这些内容吧,本来想写多态的,就留在下一节吧

猜你喜欢

转载自blog.csdn.net/wlyang666/article/details/78633239