一 继承
继承是面向对象的三大特征之一,继承就是子类继承父类的特征和行为,使得子类对象具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
二 继承的特点
优点:继承可以降低代码编写的冗余度,提高编程的效率,通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
缺点:继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。
三 继承的编写
在Java中通过extends关键字来声明一个类是从另一个类继承而来的,下面举一个具体的实例:
//定义一个动物类
public class Animal {
String name;
int age;
public Animal() {
}
public Animal(String name,int age) {
this.name=name;
this.age=age;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
}
//定义一个猫类继承动物类
public class Cat extends Animal {
public Cat() {
}
public Cat(String name,int age) {
this.name=name;
this.age=age;
}
public void catchMouse() {
System.out.println("会抓老鼠");
}
}
四 继承中成员的访问特点
在子类方法中访问一个变量时:
- 首先在子类的局部范围内找,也就是访问该变量的方法中找
- 其次在子类的成员变量范围内找
- 最后在父类的成员变量范围内找
五 super关键字
使用super关键字可以调用父类中的成员变量,父类中被重写的方法或者父类的构造方法。
方法重写
当一个子类中一个实例方法具有与其父类中的一个实例方法相同的签名(指名称、参数个数和类
型)和返回值时,称子类中的方法“重写”了父类的方法。
public class Animal{
public void eat() {
System.out.println("动物吃东西");
}
}
public class Dog extends Animal{
public void eat() {
System.out.println("狗吃骨头");
}
}
方法重写注意事项:
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 重写时,子类方法访问权限不能更低(public>默认>私有)
- 重写时,在父类中是静态方法,子类中也要是静态方法,父类中是实例方法,子类中也要是实例方法
继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法,因为:
- 子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化
- 每一个子类构造方法的第一条语句默认都是:super()
//父类
public class Father {
public Father() {
System.out.println("父类无参构造方法");
}
public Father(int age) {
System.out.println("父类带参构造方法");
}
}
//子类
public class Son extends Father {
public Son() {
System.out.println("子类无参构造方法");
}
public Son(int age) {
System.out.println("子类带参构造方法");
}
}
//测试类
public class Demo {
public static void main(String[] args) {
Son s1=new Son();
Son s2=new Son(18);
}
}
继承中隐藏父类方法
static修饰的方法是静态绑定(在编译时期,类和方法的关系就确定了),比如下面例子,子类“重写”了父类的静态方法,在编译时期,重写的静态方法已经和子类绑定在一起了,所以产生了“复写”的效果,准确来说子类静态方法隐藏了父类的静态方法。但是调用f.show()时,仍旧调用的是父类的静态方法,这是同样的道理,对于静态方法,在编译时期就静态绑定了类和方法的关系,不存在多态性,所以静态方法的调用看等号左边的类。
//父类
public class Father {
public static void show() {
System.out.println("我是父类方法");
}
}
//子类
public class Son extends Father {
public static void show() {
System.out.println("我是子类方法");
}
}
//测试类
public class Demo {
public static void main(String[] args) {
Son.show();
Father f=new Son();
f.show();
Father.show();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153962.html