目录
一、继承
1、继承是面向对象编程的三大特征之一,是一种基于已有类来创建新类的机制。由继承而得到的类称为子类(或派生类),被继承的类称为父类(或超类)。
2、Java中每个类只允许有一个父类。语法如下:class<子类>extends<父类>
3、Object类是所有类的直接父类或间接父类。
4、根据访问权限修饰符的不同,子类可以继承父类中某些成员变量和方法,提高了代码的重用性,子类也可以添加新的成员变量和方法 。
5、如果类被final修饰,则该类不能被继承:
•Java中已有的类(诸如Void、String、Class、Scanner、System、8种基本数据类型对应包装类等类)已经被final修饰,所以这些类不能被继承。
6、如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法
二、重写
1、子类可以继承父类方法,但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。父类方法在子类中重写使继承更加灵活。
2、子类重写了父类的方法,则使用子类创建的对象调用该方法时,调用的是重写后的方法,即子类中的方法
例如以下例子,父类Human,子类Students,重写walk方法
public class Human extends Object{
int age;
String sex;
String name="李四";
public Human(){
System.out.println("在吃饭");
}
public Human(int i) {
System.out.println("在走路");
}
// String name = "父类";
public void walk() {
System.out.println("在走路");
}
}
子类Students
public class Students extends Human{
String id;
String name;
// /**
public Students() {
super();//super调用父类无参构造方法
System.out.println("在做作业");
}
public Students(String name,int age) {
System.out.println(super.name);
//调用父类中的name
System.out.println(this.name);
//调用成员变量name
System.out.println(name);
//局部变量name
}
// */
// static {
// System.out.println(new Human().name);
// }
/**
* 子类可以继承父类方法,
* 但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,
* 这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。
*/
@Override
//用于标识子类重写
public void walk() {
System.out.println("学生在走路。");
}
public static void main(String args[]) {
new Students("张三",15);
new Students().walk();
}
}
(中间加了一些注解,可能会有所影响,使用时可以酌情删除)
结果如下:
3、如果要在子类非static修饰的代码块或方法中调用父类被重写的方法可以通过super关键字实现
4、@Override注解可以判断当前方法是否重写了父类的某个方法;
如果在方法上加上该注解没有出错,则说明重写了父类方法,否则没有重写父类方法。
5、子类重写父类方法需满足以下条件:
(1)方法名和参数列表:子类重写的方法和父类被重写的方法在方法名和参数列表方面相同;
(2)返回值类型:
(a)如果父类被重写的方法没有返回值类型或者返回值类型为基本数据类型,则要求子类重写的方法的返回值类型 和父类被重写方法的返回值类型相同;
(b)如果父类被重写的方法返回值类型为引用数据类型,则要求子类重写的方法的返回值类型和父类被重写方法的返回值类型相同或是其子类。