Java面向对象(下)
一、继承
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事务之间形成一种关系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物。
在Java中,类的继承是指在一个现有的类的基础上去构造一个新的类,构建出来的信类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
//定义一个父类
class Animal{
String name;//定义name的属性,如果是私有的属性则不能被子类继承
//定义动物叫的方法
public void shout(){
System.out.println("发出叫声");
}
}
//定义一个狗类,使用关键字extends用于继承
class Dog extends Animal{
//定义一个打印name属性的方法
public void printName(){
System.out.println("name="+name);
}
}
//主函数内
Dog dog = new Dog(); //创建一个Dog类的对象,子类的对象
dog.name = "沙皮狗"; //为Dog类的name属性赋值
dog.printName(); //调用Dog类输出名字的方法
dog.shout(); //调用Dog类继承的父类的方法
>>>
name=沙皮狗
发出叫声
在类的继承中,需要注意一些问题,具体如下:
1.在Java中,类只支持单继承,不允许多重继承,也就是说一个类智能有一个直接父亲,例如下面的方法是不合法的。
class A{
}
class B{
}
class C extends A,B{
}
2.多个类可以继承一个父亲。
class A{
}
class B extends A{
}
class C extends A{
}
3.在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类。
class A{
}
class B extends A{
}
class C extends B{
}
4.在Java中,一个类可以即是一个类的父类同时还可以是另外类的子类。例如上例的B。
二、重写
在继承中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型,并且保证子类方法的权限必须大于或者等于父类方法权限。
例如前面的动物叫声可以经过重写达到我们预期的目的:
//定义一个父类
class Animal{
String name;//定义name的属性,如果是私有的属性则不能被子类继承
//定义动物叫的方法
public void shout(){
System.out.println("发出叫声");
}
}
//定义一个狗类,使用关键字extends用于继承
class Dog extends Animal{
//定义一个打印name属性的方法
public void printName(){
System.out.println("name="+name);
}
public void shout(){
System.out.println("汪汪汪");
}
}
//主函数内
Dog dog = new Dog(); //创建一个Dog类的对象,子类的对象
dog.name = "沙皮狗"; //为Dog类的name属性赋值
dog.printName(); //调用Dog类输出名字的方法
dog.shout(); //调用Dog类继承的父类的方法
>>>
name=沙皮狗
汪汪汪
三、super关键字
当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在Java中专门提供了一个super关键字用于访问父类的成员。例如访问父类的成员变量、成员方法和构造方法。
1.使用super关键字访问父类的成员变量和成员方法,格式如下:
super.成员变量
super.成员方法{
{
参数1,参数2....}}
例:
//定义Animal作为父类
class Animal{
String name = "动物";
//定义动物叫的方法
public void shout(){
System.out.println("动物发出叫声");
}
}
//定义Dog继承Animal
class Dog extends Animal{
String name = "犬类";
public void shout(){
//访问父类的方法shout
super.shout();
System.out.println("汪汪汪");
}
//定义打印name属性的方法
public void printName(){
System.out.println("name="+super.name);//访问父类的成员变量name
}
}
//主函数内
Dog dog = new Dog();//创建dog类对象
dog.shout();
dog.printName();
>>>
动物发出叫声
汪汪汪
name=动物
2.使用super关键字访问父类的构造方法:
super{
{
参数1,参数2....}}
在子类的构造方法必须要访问父类的构造方法,子类的构造方法第一行有一行super关键字,如果父类的构造方法是有参的,则子类会报错。前提:必须是子类的构造方法才能调用父类的构造方法;
//定义Animal类作为父类
class Animal{
//定义Animal类的构造方法
public