一、继承

1.1 概念

当我们定义一个狗类和一个猫类时,会发现它们它们有共同的变量或者方法时,可以将它们之中的共性抽取出来,定义一个动物类,实现代码复用。

它就允许程序员在原来类的基础上进行拓展,增加新功能,这样产生的类叫做派生类。

例如:

class Animal{public String name;public int age;public void eat(){System.out.println(name+"吃饭!");}
}class Dog extends Animal{public String color;public Dog(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public void bark(){System.out.println(name+"汪汪汪");}
}
class Cat extends Animal{public Cat(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(name+"吃饭!");}public void bark(){System.out.println(name+"喵喵喵");}
}public class Test {public static void main(String[] args) {Dog dog = new Dog("大黄",2,"黄色");Cat cat = new Cat("小花",3);dog.eat();cat.eat();}
}

语法:

修饰符 class 子类 extends 父类{}

注:

子类会将父类的成员方法和成员变量继承到子类中。子类必须要与父类不同,不然就没必要继承了。

1.2 子类中访问父类的成员变量

1.2.1 子类和父类不存在同名的变量

class Base{public int a = 1;public int b = 2;}class Derived extends  Base{public int c = 3;public int d = 4;public void test(){System.out.println(this.a);System.out.println(this.b);System.out.println(this.c);System.out.println(this.d);}
}public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();}
}

1.2.2 子类和父类存在同名的变量

class Base{public int a = 1;public int b = 2;}class Derived extends  Base{public int a = 3;public int d = 4;public void test(){System.out.println(super.a);System.out.println(this.a);System.out.println(this.b);System.out.println(this.d);}
}public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();}
}

子类和父类之中都有a,但访问的结果是子类的a,因为会优先访问子类的,如果要访问父类,就可以使用super关键字(指的是子类从父类继承下来的那一块空间的地址)。

1.3 子类中访问父类的成员方法

1.3.1 成员方法名不同时

成员方法名不同时,就直接访问。

class Base{public int a = 1;public int b = 2;public void methodA(){System.out.println("Base.methodA");}
}class Derived extends  Base{public int a = 3;public int d = 4;public void methodB(){System.out.println("Base.methodB");}
}public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.methodA();derived.methodB();}
}

1.3.2 成员方法名相同时

class Base{public void method(){System.out.println("Base.method");}
}class Derived extends  Base{public void method(){System.out.println("Base.method");}
}
public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();derived.method();}
}

总结:

  1. 在子类中访问与父类成员方法名相同的方法时,如果父类和子类同名方法的参数列表不同(重载),那么就根据方法传递的参数来选择合适的方法;如果父类和子类的同名方法都是无参,那么就是优先访问子类的方法。
  2. 如果非要调用父类的方法,就使用super.方法/成员变量名。
  3. super关键字只能在非静态方法中使用,在子类方法中,访问父类的成员变量和方法。

1.4 子类的构造方法

子类对象构造时,需要先帮助父类的成员进行初始化(调用父类的构造方法)。

class Animal{public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}
}
class Dog extends Animal {public String color;public Dog(String name, int age, String color) {super(name, age);//显式的调用父类的构造函数,来初始化此时子类继承过来的父类的属性。this.color = color;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +'}';}
}public class Test1 {public static void main(String[] args) {Dog dog = new Dog("大黄",10,"黄色");System.out.println(dog);}
}

注:

  1. 当子类和父类都没有写构造方法时,编译器会默认提供子类不带参数的构造方法并且调用父类的构造方法。
  2. 如果父类中有含有参数的构造方法时,编译器就不会提供磨人的构造方法,此时就需要自己提供与父类构造方法的参数相同的super方法来显式调用父类的构造方法。
  3. 子类的构造方法中需要使用super调用父类的构造方法时,super只能放在第一行。
  4. super只能在子类的构造方法中出现一次,且不能和this同时出现。

1.5 this和super

相同点:

  1. 都是Java的关键字,都是只能在类的非静态方法中使用,用来访问非静态成员方法和字段。
  2. 在构造方法中使用时,必须是构造方法中的第一条语句,并且不能同时存在。

不同点:

  1. this是对当前对象的引用,用来访问本类的方法和属性;super相当于是子类对象中从父类继承下来的那部分成员的引用,用来访问父类继承下来的方法和属性。
  2. this是非静态成员方法的一个隐藏的参数,super不是。
  3. 在构造方法中:this(...)用于调用本类的构造方法,super(....)用于调用父类的构造方法,且不能同时在构造方法中出现。
  4. 构造方法中没有super(...)编译器会默认提供,但this(...)不写就没有。
  • 初始化的顺序,思考下面代码:
class Animal{public String name;public int age;static {System.out.println("Animal的静态代码块");}{System.out.println("Animal的实例代码块");}public Animal(){System.out.println("Animal不带参数的构造方法");}public Animal(String name, int age) {this.name = name;this.age = age;}
}
class Dog extends Animal {public String color;static {System.out.println("Dog的静态代码块");}{System.out.println("Dog的实例代码块");}public Dog(){System.out.println("Dog不带参数的构造方法");}public Dog(String name, int age, String color) {super(name, age);//显式的调用父类的构造函数,来初始化此时子类继承过来的父类的属性。this.color = color;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +'}';}
}public class Test1 {public static void main(String[] args) {Dog dog = new Dog();System.out.println("-------------------------------");Dog dog1 = new Dog();}
}

运行结果:

结论:

  1. 父类的静态代码块优先于子类的静态代码块执行,且是最早执行的,只执行一次。
  2. 父类的实例代码块和父类的构造方法紧接着执行。
  3. 子类的实例代码块和子类的构造方法紧接着执行。
  4. 第二次实例化子类对象时,父类和子类的静态代码块都不会再执行。

1.6 protected关键字

再一次思考这个:

  1. 用protected修饰就是受保护的,不同包中的子类可以使用,不同包中的非子类不能使用。
  2. 父类的private成员变量虽然在子类中不能直接访问,但是也继承到子类中了。

1.7 继承的方式

例如动物的继承可以有以下的:

但是在Java中只能有以下的继承:

注:

  1. 当你的一个类不想再被继承的时候,那么就让这个类被final修饰就好了。
  2. final可以修饰变量或字段,表示常量(不能修改)。
  3. 当final修饰方法时,表示该方法不能被重写。
  • 继承与组合

组合是一种表达类之间关系的一种方式,仅仅是将一个类的实例作为另一个类的字段。组合和继承都能实现对代码的复用,但是我们更多的是使用组合。

像学生和老师等我们可以组合成一个学校,这就叫做组合:

class Student{}
class Teacher{}
class School{private Student[] students;private Teacher[] teachers;}
public class Test2 {public static void main(String[] args) {}
}

【迷人的爪哇】——Java继承相关推荐

  1. java继承详解加练习题

    继承 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 继承的好处 提高了代码的复用性(多个类相同的成员可以收到同一个类中) 提高了代码的维护性 ...

  2. java继承对象转换_java 继承的基础(转)

    java 继承的基础(转)[@more@]继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类.运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性.该类可以被更具体的类继承,每 ...

  3. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  4. Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常

    Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常 参考文章: (1)Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并 ...

  5. java 继承类 变量、静态变量、构造函数执行顺序

    java 继承类 变量.静态变量.构造函数执行顺序 Java代码   class C{ static int prt(int i){ System.out.println(i); return i; ...

  6. Java继承时构造函数的关系

    Java继承时构造函数的关系,先来一道笔试题给大家看看: 在继承中,关于构造方法的说明,下列说法错误的是() A.子类无条件的继承父类的无参构造方法, B.子类可以引用父类中的有参构造方法,使用sup ...

  7. java继承关键字super_java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  8. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式

    一.继承的概念及用法       继承背后的思想就是        基于已存在的类来构建新类         当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...

  9. Java继承Thread类创建多线程

    Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...

  10. 「万字图文」史上最姨母级Java继承详解

    原创公众号:「bigsai」 除公众号以外拒绝任意擅自转载 文章收录在bigsai公众号和回车课堂 课程导学 在Java课堂中,所有老师不得不提到面向对象(Object Oriented),而在谈到面 ...

最新文章

  1. 使用Node.js写一个简单的api接口
  2. java sleep不能使用_java无主窗口GUI程序主线程不能调用sleep(long)方法,会产生异常...
  3. 简单配置基于桥接,RIP,NAT,PAT的网络拓扑
  4. boost::mpl::less相关的测试程序
  5. [众包]Eclipse 运行简单亚马逊AMT模板
  6. python里的装饰器
  7. 使用Node.js 搭建静态服务器
  8. 机器学习 流式特征_Web服务与实时机器学习端点的流式传输
  9. python 类继承 baseclass_Python:Dataclass继承自base Dataclass,如何将值从base升级到新类?...
  10. Vue中部署百度富文本编辑器UEditor及其自带的后端,并加入秀米插件
  11. 发送ajax将浏览器卡死,jQuery Ajax同步参数致使浏览器假死怎么办
  12. 集成墙面拆后恐怖极了,没想到这么美!
  13. CSP2022 初赛游记
  14. 3.20 关于怎样做好小红书直播的一些技巧【玩赚小红书】
  15. 什么是数据库备份DBS
  16. PID控制器——MATLAB/Simulink仿真以及性能比较与分析
  17. PS创建选区的工具-----快速选择和魔棒
  18. Android文件存储---内部存储,外部存储以及各种存储路径解惑
  19. 什么是Arduino
  20. stata:应用stata学习计量经济学原理 practice 2 stata绘图基础

热门文章

  1. 2013年山东省第四届ACM大学生程序设计竞赛
  2. 计算机系统组成及介绍,行驶系统的组成和作用介绍
  3. ERP IPQC是什么意思 IPQC工作职责和IPQC工作流程
  4. 用C#输出99乘法表
  5. linux上的远程桌面工具
  6. bigemap如何设置等高线坐标系并输出
  7. format()用法
  8. cortellis数据库价格与价值分析
  9. MySQL数据库存储价格金额使用的数据类型中float、double、decimal的区别
  10. 网易有道Redis云原生实战