目录
继承
一个人的属性有名字,身高。学生也是人,但学生拥有其特殊的属性,如专业。当定义学生类时,名字,身高等人拥有的属性学生都需要写上去,这时候会重复很多代码,使用继承即可将Person类的属性与方法继承给Student类,此时Student类只要写自己特有的代码即可。
子类继承父类的属性与方法,不继承构造器,此类方法可以避免代码的重复,使得代码更加简洁,关系更清晰。(子类的名字 extends 父类的名字即可实现继承功能)
如下,student类是Person的子类。
class Person{
String name;
int height;
public void rest(){
System.out.println("休息一会儿!");
}
}
class student extends Person{
String major;
public void study(){
System.out.println("正在学习Java");
}
继承的使用要点
- 父类也称作超类,基类。子类也可以叫做派生类等。
- Java中只有单继承(一个子类只能有一个父类,但是一个父类可以有许多子类),没有像c++那样的多继承、多继承会引起混乱,使得继承链过于复杂,系统难以维护。
- Java中类没有多继承,接口有多继承。
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)
- 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
组合
组合也能实现继承所能实现的功能。组合的核心是将父类对象作为子类的属性,子类通过调用这个属性来获得父类的属性和方法。(如果A类具有B类的所有属性与方法,那么就在A类里面new一个B类的对象,则即可用A类的对象调用B类的对象,即可调用B类的属性。)
pubic class Test{
public static void main(Srting[] args){
Student s = new Student("朴彩英",170,"Java");
s.person.rest();
s.study();
}
}
class Person{
String name;
int height;
public void rest(){
System.out.println("休息一会儿");
}
}
class Student {
Person person = new Person();//实现了Student类与Person类的组合
String major;
public Student(String name,int heignt,String major){
this.person.name=name;
this.person.height=height;
this.major=major;
}
}
方法的重写
方法重写的前提是必须存在继承关系,在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。重写的方法,可以用不同的对象来区分调用的是哪一个方法。
注意:
- 父类的成员方法只能被它的子类重写。
- 声明为 final 的方法不能被重写。 声明为 static 的方法不能被重写,但是能够再次声明。
- 构造方法不能被重写。
- 子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法。
- 子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。
方法的重写需要满足以下三个条件
- “==”:方法名,形参名相同。
- “<=”:返回值类型和声明异常类型,子类小于父类。
- “>=”:访问权限,子类大于等于父类。(访问权限由小到大:private——>default——>protected——>public)
如下代码,在父类 Animal 中定义 getInfo() 方法,并在子类 Cat 中重写该方法.
public class Animal {
public String name; // 名字
public int age; // 年龄
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo() {
return "我叫" + name + ",今年" + age + "岁了。";
}
}
public class Cat extends Animal {
private String hobby;
public Cat(String name, int age, String hobby) {
super(name, age);
this.hobby = hobby;
}
public String getInfo() {
return "喵!大家好!我叫" + this.name + ",我今年" + this.age + "岁了,我爱吃" + hobby + "。";
}
}
final关键字
final关键字的作用
- 修饰变量:被它修饰的变量不可改变,一旦赋了初值,就不能被重新赋值, 如:final int MAX-SPEED=120;
- 修饰方法:该方法不可被子类重写,但是可以被重载! 如:public final void study{}
- 修饰类:修饰的类不能被继承,比如:Math,String等。 如:final class A{}
instanceof运算符
instance是二元运算符,左边是对象,右边是类,当对象是右面类或子类所创建的对象时,返回值为true,否则返回false。
public class Test{
public static void main(String[] args){
Student s = new Student("朴彩英",170,"java");//此处假设Student为Person的子类。
System.out.println(s instanceof Person);
System.out.println(s instanceof Student);
}
}
他们的返回值都为true