面向对象(1)——类的继承、final关键字、抽象类和接口
1 类的继承
1.1继承的概念
定义:类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类。子类会自动拥有父类所有可继承的属性和方法。
关键字:使用extends关键字
代码:子类(dog),父类(animal)
class Animal{ String name; void shout(){ System.out.println("动物发出叫声”); } } class Dog extends Animal{ public void printName(){ System.out.println("name="+name); } }
继承应注意的问题:
1)子类与父类的关系只能是多对一或者一对一,不可一对多(一个人不能有很多个父亲)
2)java中可多层继承
3)子类和父类只是相对概念
1.2 重写父类方法
重写的要求:在子类中重写的方法要和父类中被重写的方法具有相同的方法名、参数列表以及返回值类型;且子类中重写的方法不能有比父类中被重写的方法更严格的访问权限
1.3 super关键字访问父类的成员(成员变量、成员方法、构造方法)
1)使用super关键字调用父类的成员变量和成员方法
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);}}
该例中,父类——Animal,子类——Dog,父类成员变量——String name,父类成员方法 void shout(){}
2)使用super关键字调用父类的构造方法
super ([参数1,参数2···])
在子类的构造方法中会自动调用父类的构造方法,这时可以在子类的构造方法中通过super关键字调用父类的哪个构造方法。如果没有指定,则在实例化子类对象时,会自动调用父类无参的构造方法。如果父类的构造方法都有参,则程序出错。
注:通过super关键字调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次,
2 final关键字
final关键字的特性:
1)final修饰的类不能被继承;
2)final修饰的方法不能被子类重写
3)final修饰的变量(成员变量和局部变量)是常量,只能赋值一次。【成员变量在类中方法外,局部变量在类的方法中或类中的代码块中。两者区别详见:https://www.cnblogs.com/huangminwen/p/5935130.html】
3 抽象类和接口
3.1 抽象类
抽象方法是一类不包含方法体的方法,抽象方法必须用abstact关键字修饰,含有抽象方法的类是抽象类,抽象类必须使用abstract关键字修饰。
抽象类有可能包含抽象方法,但是包含抽象方法的类必须声明为抽象类
抽象类不能被实例化。因为抽象类中可能包含抽象方法,抽象方法是没有方法体,不可以被调用
如果想调用抽象类中定义的方法,则必须创建一个子类,并在子类中将抽象类中的所有抽象方法进行实现
抽象类的定义:编程规范化(详见: https://zhidao.baidu.com/question/199723919478667925.html)
3.2 接口
如果需要定义一个所有方法都是抽象的类,则可以将这个类定义成接口。需要使用interface关键字来声明
package test; interface Animal{ int ID=1; void breathe(); void run(); } //Dog类实现Animal接口 class Dog implements Animal{ //实现breathe()方法 public void breathe(){ System.out.println("狗在呼吸"); } //实现run()方法 public void run(){ System.out.println("狗在跑"); } } public class example0513 { public static void main(String args[]) { Dog dog =new Dog(); dog.breathe(); dog.run(); } }
接口中的默认修饰符
1)接口中的方法默认用public abstract修饰
2)接口中的变量默认用public static final 来修饰,即全局变量
接口的特点:
1)接口中的方法都是抽象的,不能实例化对象
2)当一类实现接口时,若这个类是抽象类,则可只实现接口中的部分方法;反之,则需要实现接口中的所有方法。
3)一个类通过implements关键字实现接口时,可以实现多个接口,被实现的接口之间要用逗号隔开。如下:
interface Run{ ... } interface Fly{ ... } class Bird implements Run,Fly{ ... }
4)一个接口可以通过extends关键字继承多个接口,接口之间用逗号隔开
interface Run{ ... } interface Fly{ ... } interface Bird extends Run,Fly{ ... }
5)一个类在继承另一个类的同时还可以实现接口,此时extends关键字必须位于implements关键字前,
class Dog extends Canidae implements Animal{ ···}