学习目标:
掌握继承和多态基础运用
能看懂类的继承和多态关系
能写出继承和多态的例子
学习内容:
继承
基于一个已存在的类,创建一个新的类。已存在的类即父类,新的类即子类,继承就是子类继承并拥有父类的属性和方法,同时,子类还有拥有父类所不具有的属性和方法。
父类,也称为基类、超类(superclass);子类,也称为派生类。
JAVA中“继承”的特点
JAVA中一个类只能继承一个父类。不像C++等语言那样,可以继承多个类。这也是JAVA比较容易学的一方面
只能继承父类中非private成员属性和方法,private是父类所特有的不能继承
子父类之间,可以用protecded修饰。protecded可以在本包中访问,可子父类之间访问(子父类在不同的包也行)。
“继承”使用关键字extends
如 class 父类{ }
class 子类 extend 父类{ }
重载和重写
重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
重载:
(1)重载可以有不同的访问修饰符
(2)重载能够抛出不同的异常
(3)重载一定要有不同的参数列表
(4)重写是垂直关系,是子类和父类之间的关系
重写:
(1)重写访问修饰符的限制一定要大于被重写方法的访问修饰符
(2)重写的参数列表一定要完全和被重写的方法相同,专否则的话不能称其为重写而是重载
(3)重写返回的类型一定要一直和被重写的方法的返回类型相同,否则不能称其为重写而是重载
(4)重写方法一定不可以抛出新的检查异常或者是比被重写方法申明更加宽泛的检查型异常
(5)重写是垂直关系,是子类和父类之间的关系
public class Perple extends Monkey {
public Perple(String s) {
super(s);
}
@Override//重写
public void speak() {
System.out.println("小样的,不错嘛,会说话了!");
}
public void think() {
System.out.println(" 别说话,认真思考");
}
}
this关键字和super关键字
this是一个引用,它指向自身的这个对象,this一般出现在方法里面,当这个方法还没有调用的时候,this指的是谁并不知道。但是实际当中,你如果new了一个对象出来,那么this指的就是当前这个对象。对哪个对象调用方法,this指的就是调用方法的这个对象(你对哪个对象调用这个方法,this指的就是谁)。如果再new一个对象,这个对象他也有自己的this,他自己的this就当然指的是他自己了。
1.在类的方法定义中使用的this关键字代表使用该方法的对象的引用
2.当必须指出当前方法的对象是谁时要使用this
3.有时使用this可以处理方法中成员变量和参数重名的情况
4.this可以看作是一个变量,他的值是当前对象的引用
public class Human {
private String name;
private int age;
public Human(){}
public Human(String name, int age) {
this.name = name;
this.age = age;
}
}
super是一个指向超类的引用
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用,可以调用超类的普通方法和属性
public class Man extends Human{
private static String sex="男";
public Man(String name, int age) {
super(name, age);
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
Man.sex = sex;
}
}
final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final 含义为 "最终的"。
使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写。
构造器
构造器也叫构造方法或构造函数,分为有参构造器和无参构造器;
- 构造器也是一种方法,只不过是一种特殊的方法,它会在对象创建的时候被调用;
- 构造器最大的作用就是在创建对象的时候进行对象的初始化,有参构造器可以实现对象传参(后面会比较着来看有参构造器方便在哪儿了);
- 一个类可以有零个(如果没有自己定义编译器会帮你提供无参构造器)或多个构造器;
- 构造器不能被子类继承,Java中子类会自动调用父类的构造器
构造方法和普通方法的区别:
1、命名:构造器的方法名必须和类名相同,一般方法的方法名在命名规范的情况下可以随便定义。
2、修饰符:构造器不能被static、final、synchronized、abstract和native修饰
3、返回值:构造器没有返回值(但是不需要写void),一般方法要有返回值或者无返回值(void)
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
public Shape(int height, int width) {
this.height = height;
this.width = width;
}
public Rectangle(int height, int width) {
super(height, width);
}
多态
多态是继封装、继承之后,面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
多态体现为父类引用变量可以指向子类对象。前提条件是必须有子父类关系。
注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态的定义与使用格式
定义格式:父类类型 变量名=new 子类类型();
可以理解为:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。