一、继承作用

继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性

继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径

类A可以有自己的属性和方法

二、继承实现

类的继承格式
在Java中使用extends关键字完成类的继承关系,操作格式:
class 父类{} // 定义父类
class 子类 extends 父类{} // 使用extends关键字实现继承
  1. package com.pb.person;
  2. /*
  3. * 父类
  4. */
  5. public class Person {
  6. private String name; //姓名
  7. private String sex; //性别
  8. private int age;//年龄
  9.  
  10. //设置getter和setter方法
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public String getSex() {
  18. return sex;
  19. }
  20. public void setSex(String sex) {
  21. if(sex.equals("男") || sex.equals("女")){
  22. //设置性别限制,不合法的值将提示错误
  23. this.sex = sex;
  24. }else{
  25. System.out.println("性别不合法,性别只能是:男或者女");
  26. }
  27. }
  28. public int getAge() {
  29. return age;
  30. }
  31. public void setAge(int age) {
  32. if(age>0 && age<=150){
  33. //设置年龄限制
  34. this.age = age;
  35. }else{
  36. System.out.println("年龄只能在1-150岁之间");
  37. }
  38. }
  39. public Person() {
  40. this.name = "无名氏";
  41. this.sex = "男";
  42. this.age = 22;
  43. }
  44. public Person(String name, String sex, int age) {
  45. this.name = name;
  46. this.sex = sex;
  47. this.age = age;
  48. }
  49.  
  50. public void say(){
  51. System.out.println("自我介绍:");
  52. System.out.println("姓名:"+this.name);
  53. System.out.println("性别:"+this.sex);
  54. System.out.println("年龄:"+this.age);
  55. }
  56.  
  57. }

子类:

  1. package com.pb.person;
  2. /*
  3. * 子类
  4. */
  5. public class Student extends Person {
  6. private int stuNo ; //学号
  7. private String specialty; //专业
  8.  
  9. public Student() {
  10.  
  11. }
  12. public Student(String name, String sex, int age,int stuNo,String specialty) {
  13. super(name, sex, age);
  14. this.stuNo=stuNo;
  15. this.specialty=specialty;
  16. }
  17.  
  18. //getter/setter方法
  19. public int getStuNo() {
  20. return stuNo;
  21. }
  22. public void setStuNo(int stuNo) {
  23. this.stuNo = stuNo;
  24. }
  25. public String getSpecialty() {
  26. return specialty;
  27. }
  28. public void setSpecialty(String specialty) {
  29. this.specialty = specialty;
  30. }
  31.  
  32. }

测试类

  1. package com.pb.persontest;
  2.  
  3. import com.pb.person.Student;
  4.  
  5. public class Test {
  6.  
  7. public static void main(String[] args) {
  8. Student stu=new Student("张三", "男", 22, 121, "计算机科学与技术") ;
  9. stu.say();
  10.  
  11. }
  12.  
  13. }

结果:

自我介绍:
姓名:张三
性别:男
年龄:22

以下可以发现,子类的学号,和专业并没有输出,

默认调用的父类的say()方法

需要子类重写父类的方法

三、方法的重写

方法的重写是发生的子类对父类的过程中,是在2个类中,和方法重载是在一个类中

方法重写有以下要求

Student类重写Person类中的say()方法

  1. package com.pb.person;
  2. /*
  3. * 子类
  4. */
  5. public class Student extends Person {
  6. private int stuNo ; //学号
  7. private String specialty; //专业
  8.  
  9. public Student() {
  10.  
  11. }
  12. public Student(String name, String sex, int age,int stuNo,String specialty) {
  13. super(name, sex, age);
  14. this.stuNo=stuNo;
  15. this.specialty=specialty;
  16. }
  17. //方法重写
  18. @Override
  19. public void say() {
  20.  
  21. super.say();
  22. System.out.println("学号是:"+this.stuNo);
  23. System.out.println("专业是:"+this.specialty);
  24. }
  25.  
  26. //getter/setter方法
  27. public int getStuNo() {
  28. return stuNo;
  29. }
  30. public void setStuNo(int stuNo) {
  31. this.stuNo = stuNo;
  32. }
  33. public String getSpecialty() {
  34. return specialty;
  35. }
  36. public void setSpecialty(String specialty) {
  37. this.specialty = specialty;
  38. }
  39.  
  40. }

测试类不变:

  1. package com.pb.persontest;
  2.  
  3. import com.pb.person.Student;
  4.  
  5. public class Test {
  6.  
  7. public static void main(String[] args) {
  8. Student stu=new Student("张三", "男", 22, 121, "计算机科学与技术") ;
  9. stu.say();
  10.  
  11. }
  12.  
  13. }

结果:

自我介绍:
姓名:张三
性别:男
年龄:22
学号是:121
专业是:计算机科学与技术

重写以后,调用的就是子类重写后的方法

四、super关键字

super必须是出现在子类中(子类的方法和构造方法中),而不是其他位置,在构造方法中必须出现在第一行

用以访问父类的成员,例如:父类的属性、方法、构造方法

访问权限的限制,例如无法通过super访问private成员

五、继承条件下构造方法的调用规则

规则一:如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法

规则二:如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类的相应的构造方法,而不执行父类无参数构造方法

 规则三:如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上2条规则

5.1、例一

  1. package compb.demo4;
  2. /*
  3. * 父类
  4. */
  5. public class StaticSuper {
  6. public static String staticGet() {
  7. return "父类静态方法";
  8. }
  9.  
  10. public String dynamicGet() {
  11. return "父类动态方法";
  12. }
  13. }
  14.  
  15. package compb.demo4;
  16. /*
  17. * 子类
  18. */
  19. public class StaticSub extends StaticSuper{
  20.  
  21. //静态方法不能重写
  22. public static String staticGet() {
  23. return "子类静态方法";
  24. }
  25. @Override
  26. public String dynamicGet() {
  27. return "子类动态方法重写父类动态方法";
  28. }
  29.  
  30. }
  31.  
  32. package compb.demo4;
  33. /*
  34. * 测试
  35. */
  36. public class Test {
  37.  
  38. public static void main(String[] args) {
  39. StaticSub s= new StaticSub(); //声明子类对象
  40. System.out.println(s.staticGet()); //调用子类静态方法
  41. System.out.println(s.dynamicGet()); //调用子类动态方法
  42. }
  43.  
  44. }

结果:

子类静态方法
子类动态方法重写父类动态方法

5.2、例二、

  1. package com.pb.demo5;
  2. /*
  3. * 父类
  4. */
  5. public class VenderLate {
  6.  
  7. public VenderLate() {
  8. System.out.print("VenderLate out");
  9. }
  10.  
  11. }
  12. package com.pb.demo5;
  13.  
  14. public class MoveGoods extends VenderLate{
  15.  
  16. public MoveGoods( ) {
  17. System.out.println("MoveGoods out!");
  18. }
  19.  
  20. public MoveGoods(String s) {
  21. System.out.println(s);
  22. }
  23.  
  24. }
  25. package com.pb.demo5;
  26. /*
  27. * 测试类
  28. */
  29. public class Test {
  30.  
  31. public static void main(String[] args) {
  32. MoveGoods m=new MoveGoods();
  33. MoveGoods g=new MoveGoods(" child");
  34.  
  35. }
  36.  
  37. }

结果:

VenderLate outMoveGoods out!
VenderLate out child

5.3 、例三

  1. package com.pb.demo4;
  2. /*
  3. * 父类
  4. */
  5. public class SuperClass {
  6. private String name;
  7.  
  8. public SuperClass() {
  9. System.out.println("父类的无参数构造方法");
  10. }
  11. public SuperClass(String name) {
  12. System.out.println("父类有一个参数的构造方法:"+name);
  13. }
  14. //setter/getter方法
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. }

子类

  1. package com.pb.demo4;
  2.  
  3. public class SubClass extends SuperClass {
  4. private String name;
  5. private int count;
  6.  
  7. public SubClass() {
  8. System.out.println("子类无参数构造方法");
  9. }
  10. public SubClass(int count) {
  11. System.out.println("子类有一个参数构造方法:"+count);
  12. }
  13.  
  14. //调用父类有参数的构造方法
  15. public SubClass(String name) {
  16. super(name);
  17. this.name=name;
  18. System.out.println("调用子类有一个参数构造方法,同时使用super显示调用"+name);
  19. }
  20.  
  21. //setter/getter方法
  22. public String getName() {
  23. return name;
  24. }
  25.  
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getCount() {
  30. return count;
  31. }
  32. public void setCount(int count) {
  33. this.count = count;
  34. }
  35.  
  36. }

测试类:

  1. package com.pb.demo4;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6. System.out.println("*******调用子类无参数构造方法**********");
  7. SubClass s1=new SubClass();
  8. System.out.println("*******调用子类有一个参数构造方法但是没有使用super显示调用**********");
  9. SubClass s2=new SubClass(34);
  10. System.out.println("*******调用子类有一个参数构造方法,同时使用super显示调用**********");
  11. SubClass s3=new SubClass("张三");
  12. }
  13.  
  14. }

结果:

  1. *******调用子类无参数构造方法**********
  2. 父类的无参数构造方法
  3. 子类无参数构造方法
  4. *******调用子类有一个参数构造方法但是没有使用super显示调用**********
  5. 父类的无参数构造方法
  6. 子类有一个参数构造方法:34
  7. *******调用子类有一个参数构造方法,同时使用super显示调用**********
  8. 父类有一个参数的构造方法:张三
  9. 调用子类有一个参数构造方法,同时使用super显示调用张三

六、Object类

所有的有类都自动继承java.lang包中的Object类

Object类是所有类的父类(基类)

在定义一个类时如果没有使用extends关键字,则默认继承Object类

Object常被重写的方法:

Java从零开始学十五(继承)的更多相关文章

  1. Java从零开始学十九(异常)

    一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...

  2. Java从零开始学十八(抽象类和接口)

    一.什么是抽象类和接口 抽象类.接口与类是一个层次的概念,是java中极其重要的概念. 抽象类是从多个类中抽象出来的公共模板,提供子类均具有的功能. 接口是从多个类中抽象出来的规范,体现的是规范和实现 ...

  3. Java从零开始学十六(多态)

    一.什么是多态 多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用程序函数同名问题.多态有两种表现形 ...

  4. Java从零开始学十四(包和访问控制)

    一.java中的包 Java文件的组织形式Windows中的文件功能类似 在开发比较大的项目时,不可能只涉及到一个java文件,可能要创建几十,甚至几百个java文件,这个时候,我们就可以使用包,把相 ...

  5. Java从零开始学十(Arrays类对数组的常用方法)

    一.Arrays类常用方法 二.简单例子 package com.pb.demo1; import java.util.Arrays; /* * Arrays工具类的中的几个常用方法 * 1.copy ...

  6. Java从零开始学十二(构造方法)

    一.构造方法 构造方法的主要目的是为类中的属性初始化 二.构造方法的定义格式 class 类名称{ 访问权限 类名称(类型1 参数1,类型2 参数2,…){ 程序语句 ; …    // 构造方法没有 ...

  7. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  8. “全栈2019”Java第八十五章:实现接口中的嵌套接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. HDU 4217 Hamming Distance 随机化水过去

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  2. 小程序在wxml页面中取整

    小程序无法像html中,在页面中直接parseInt() index.wxml {{price | Int}} 小程序还有另一种处理方法 wxs 是一种类似于js脚本的东西 filters.wxs v ...

  3. gcc 内联汇编

    http://www.cnblogs.com/zhuyp1015/archive/2012/05/01/2478099.html

  4. QT 开发资料

    http://pan.baidu.com/s/1bntYkpx 密码: fgsa

  5. 转 iOS开发debug跟release版本log屏蔽方法

    简单介绍以下几个宏: ) __VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).宏前面加上##的作用在于,当可变参数 ...

  6. Pycharm配置autopep8让Python代码更符合pep8规范

    一.何为pep8? PEP 8官方文档 -- Style Guide for Python Code PEP8中文翻译(转) 二.Pycharm中配置pep8 Pycharm本身是有pep8风格检测的 ...

  7. andriod studio 获得程序名

    getResources().getString(R.string.app_name)

  8. struts2点滴记录

    1.s:textfield 赋值方法 <s:textfield name="Tname" value="%{#session.Teacher.name}" ...

  9. ubuntu 键盘布局修改

    键盘打不出 | 符号 sudo dpkg-reconfigure keyboard-configuration 改为标准的罗技键盘

  10. JS 中div内容的显示和隐藏

    1. document.getElementById("dialog-auclot-status").style.display="none";//页面加载时隐 ...