1.继承是面向对象的三大特性之一
1.1 继承的概念
类的继承就是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。j如果想要声明一个类继承另外一个类,要用extends关键字。
1.2 继承的语法
class ParentClass{
//属性//方法//构造方法
}
class childClass extends ParentClass{
//属性//方法//构造方法
}
例题:
class Animal{
String name;
void shot(){
System.out.println("动物发出叫声");
}
}
class Dog extends Animal{
public void printName(){
System.out.println("name="+name);
}
}
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.name="小狗";
dog.printName();
dog.shot();
}
}
在例题中,Dog继承了Animal类,于是Dog是Animal的子类,在子类中,虽然没有定义name属性和short()方法,但是却能访问这两个成员,说明:子类在继承父类的时候,会自动拥有父类所有的成员。
1.3 类的继承中,需要注意的问题
1.在java中,类只支持单继承,不允许多重继承
class A{}
class B{}
class C extends A,B{} //C类不可以同时继承A,B类
2.多个类可以继承一个父类
class A{}
class B extends A{}
class C extends A{}
3.在java中,多层继承是可以的,既一个类的父类可以再去继承另外的父类
class A{}
class B extends A{} //类B是类A的子类
class C extends B{} //类C是类B的子类,同时也是类A的子类
4.在Java中,子类和父类是一对相对的概念,也就是说一个类是某个父类的同时,也可以是另外一个类的子类。
1.4 重写父类方法
在继承关系中,子类会自动继承父类中定义的方法,但有时在继承中需要对继承的方法进行一些修改,即对父类的方法进行重写。但需要注意的是:在子类中重写的方法需要和父类被重写的方法具有相同的方法名,参数列表以及返回值类型。
class Animal{
String name;
void shout(){
System.out.println("动物发出叫声");
}
}
class Cat extends Animal{
void shout(){
System.out.println("喵喵……");
}
}
public class Test {
public static void main(String[] args) {
Cat cat=new Cat();
cat.shout();
}
}
注意:子类重写父类父类方法时,不能使用比父类中被重写的方法更严格的访问权限。
1.5 super关键字
1.使用super关键字调用父类的成员变量和成员方法。
格式为:
super.成员变量;
super.成员方法(参数1,参数2…);
class Animal{
String name="动物";
void shout(){
System.out.println("动物发出叫声");
}
}
class Dog extends Animal{
String name="犬类";
void shout(){
super.shout();
}
void printName(){
System.out.println("name="+super.name);
}
}
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.printName();
dog.shout();
}
}
2.使用super关键字调用父类的构造方法
格式为:
super(参数1,参数2…);
class Animal{
public Animal(String name){
System.out.println("我是一只"+name);
}
}
class Dog extends Animal{
public Dog(){
super("小狗狗");
}
}
public class Test2 {
public static void main(String[] args) {
Dog dog=new Dog();
}
}
注意:通过super调用父类构造方法的代码必须要位于子类构造方法的第一行,并且只能出现一次;
在子类的构造方法中一定会调用父类的某个构造方法,这时可以在子类的构造方法中通过super指定调用父类的哪个构造方法,如果没有指定,在实例化对象时,会自动调用父类的无参构造方法;所以,可以在子类的构造方法调用父类的构造方法,也可以在父类中定义一个无参的构造方法。
class Human{
String name;
int age;
public Human(String name,int age){
this.name=name;
this.age=age;
}
}
class Student extends Human{
String num;
String className;
public Student(String name, int age,String num,String className) {
super(name, age);
this.num=num;
this.className=className;
}
public void eat(){
System.out.println(name+"在吃饭");
}
}
public class Test {
public static void main(String[] args) {
Student student=new Student("张三",20,"o1","计科");
student.eat();
}
}
注意:子类中还有他自己的属性,那么子类在继承父类的构造方法时先用super继承子类中的属性,放在第一行,最后再调用自己的属性。