继承

继承的例子:

class Father
{public void f1(){System.out.println("hi");}
}public class Son extends Father
{public static void main(String[] a){Son a=new Son();//编译器会自动给无参构造函数s.f1();//Son没有定义f1,而是从父类继承来的}
}

Java 中子类继承父类的语法格式如下:

修饰符 class class_name extends extend_class {// 类的主体
}

其中,class_name 表示子类(派生类)的名称;extend_class 表示父类(基类)的名称;extends 关键字直接跟在子类名之后,其后面是该类要继承的父类名称 。

  • Java 与 C++ 定义继承类的方式十分相似。Java 用关键字 extends 代替了 C++ 中的冒号(:)。在 Java 中,所有的继承都是公有继承, 而没有 C++ 中的私有继承和保护继承。

  • 类的继承不改变类成员的访问权限,也就是说,如果父类的成员是公有的、被保护的或默认的,它的子类仍具有相应的这些特性,并且子类不能获得父类的构造方法。

  • 单根继承原则:每个类都只能继承一个类。即 Java 不支持多继承,只允许一个类直接继承另一个类,即子类只能有一个直接父类,extends 关键字后面只能有一个类名。

很多地方在介绍 Java 的单继承时,可能会说 Java 类只能有一个父类,严格来讲,这种说法是错误的,应该是一个类只能有一个直接父类,但是它可以有多个间接的父类。例如,Student 类继承 Person 类,Person 类继承 Person1 类,Person1 类继承 Person2 类,那么 Person1 和 Person2 类是 Student 类的间接父类。图 1 展示了单继承的关系。

从图 1 中可以看出,三角形、四边形和五边形的直接父类是多边形类,它们的间接父类是图形类。图形类、多边形类和三角形、四边形、五边形类形成了一个继承的分支。在这个分支上,位于下层的子类会继承上层所有直接或间接父类的属性和方法。如果两个类不在同一个继承树分支上,就不会存在继承关系,例如多边形类和直线。

  • 如果定义一个 Java 类时并未显式指定这个类的直接父类,则这个类默认继承 java.lang.Object 类。因此,java.lang.Object 类是所有类的父类,要么是其直接父类,要么是其间接父类。因此所有的 Java 对象都可调用 java.lang.Object 类所定义的实例方法。

  • 每个Java类都有也必须有构造函数。

  • 每个子类的构造函数的第一句话都是默认调用父类的无参构造函数super(),除非子类的构造函数第一句话是super,且super语句必须放在第一条,不会出现连续两条super语句(否则编译器会报错)。

super关键字

由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。
super 关键字的功能:

  • 在子类的构造方法中显式的调用父类构造方法

  • 访问父类的成员方法和变量。

super调用父类构造方法

uper 关键字可以在子类的构造方法中显式地调用父类的构造方法,基本格式如下:

super(parameter-list);

其中,parameter-list 指定了父类构造方法中的所有参数。super( ) 必须是在子类构造方法的方法体的第一行。

例1:

public class Person {public Person(String name) {}
}
public class Student extends Person {}

会发现 Student 类出现编译错误,提示必须显式定义构造方法.这是因为如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为 super(),一般这行代码省略了)。所以当在父类中定义了有参构造方法,但是没有定义无参构造方法时,编译器会强制要求我们定义一个相同参数类型的构造方法。

super访问父类成员

当子类的成员变量或方法与父类同名时,子类的成员变量或方法会对父类的成员变量或方法进行覆盖。如果想对父类的成员变量或方法进行访问可以使用 super 关键字来访问。如果子类重写了父类的某一个方法,即子类和父类有相同的方法定义,但是有不同的方法体,此时,我们可以通过 super 来调用父类里面的这个方法。

使用 super 访问父类中的成员与 this 关键字的使用相似,只不过它引用的是子类的父类,语法格式如下:

super.number

其中,member 是父类中的属性或方法。使用 super 访问父类的属性和方法时不用位于第一行。

super和this的区别

this 指的是当前对象的引用,super 是当前对象的父对象的引用。下面先简单介绍一下 super 和 this 关键字的用法。

  • super.父类属性名:调用父类中的属性

  • super.父类方法名:调用父类中的方法

  • super():调用父类的无参构造方法

  • super(参数):调用父类的有参构造方法

如果构造方法的第一行代码不是 this() 和 super(),则系统会默认添加 super()。

this 关键字的用法:

  • this.属性名:表示当前对象的属性

  • this.方法名(参数):表示调用当前对象的方法

当局部变量和成员变量发生冲突时,使用this.进行区分。

关于 Java super 和 this 关键字的异同,可简单总结为以下几条。

1.子类和父类中变量或方法名称相同时,用 super 关键字来访问。可以理解为 super 是指向自己父类对象的一个指针。在子类中调用父类的构造方法。

2.this 是自身的一个对象,代表对象本身,可以理解为 this 是指向对象本身的一个指针。在同一个类中调用其它方法。

3.this 和 super 不能同时出现在一个构造方法里面,因为 this 必然会调用其它的构造方法,其它的构造方法中肯定会有 super 语句的存在,所以在同一个构造方法里面有相同的语句,就失去了语句的意义,编译器也不会通过。

4.this( ) 和 super( ) 都指的是对象,所以,均不可以在 static 环境中使用,包括 static 变量、static 方法和 static 语句块。

5.从本质上讲,this 是一个指向对象本身的指针, 然而 super 是一个 Java 关键字。

Java继承,接口,抽象类相关推荐

  1. Java 继承 与 抽象类

    Java 继承 与 抽象类 继承 抽象类 继承 1.一个类 从另一个类中派生而来,就是继承. 2.继承也是面向对象语言的三大特征之一. 面向对象的语言都具有三大特征,分别是 封装,继承,多态. 3.什 ...

  2. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  3. java类的继承,接口,抽象类总结

    1. 类的继承 类和类之间可以实现继承关系,即从一个类中继承它的部分属性和部分方法,避免重写代码,提高了代码的重用性.比如武侠小说,言情小说,玄幻小说都属于小说,拥有小说所拥有的属性.继承的格式是pu ...

  4. Java实验三 Java继承、抽象类与接口(13题)

    文章目录: 一:基本问题 二:说明下面说法是否正确 三:编写一个Java应用程序.设计一个汽车类Vehicle,包含的成员属性有:车轮个数wheels和车重weight.小车类Car是Vehicle的 ...

  5. java 继承 接口 练习,java:面向对象-抽象类、继承、接口结合练习

    public class Demo5_Animal { public static void main(String[]args){ Cat_Test c=new Cat_Test("加菲猫 ...

  6. java 继承接口语法_java的继承、接口方面的语法及知识

    继承(inheritance):一个类只能继承一个类 代码复用 继承的语法: class ChildClass extends ParentsClass{ } 父类的属性子类中都存在,只是有没有权限访 ...

  7. java继承接口和泛型,JavaSE习题 继承接口和泛型

    问答题: 1.子类在什么情况下可以继承父类友好成员? 答:在同一个包内 2.子类通过怎样的方法可以隐藏继承的成员变量? 答:声明一个与父类相同变量名的成员变量 3.子类重写继承的方法原则是什么? 答: ...

  8. 类封装继承接口抽象类综合测试

    第一题 1.定义一个学生类型 1)有姓名,年龄,所在班级,c成绩,html成绩,java成绩这几个属性 2)有一个输出自己信息的方法 3)有一个输出总成绩的方法 要求:用该学生类型定义两个学生变量,并 ...

  9. JAVA 继承基本类、抽象类、接口

    Java是一个面向对象的语言,java面向对象一般有三大特征:封装.继承.多态. 封装:就是把一些属性和方法封装到一个类里. 继承:就如子类继承父类的一些属性和方法. 多态:就如一个父类有多个不同特色 ...

  10. java 抽象类继承抽象类_Java之继承、抽象类、接口篇

    一.继承(extends) 什么是继承? 继承是对现实生活中的"分类"概念的一种模拟. 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承" ...

最新文章

  1. 大数据目标检测推理管道部署
  2. python安装MySQLdb出错解决方案
  3. 15合并两个排序的链表
  4. oracle undoautotune,温故知新 - UNDO,UNDO_RETENTION 及 _undo_autotune
  5. C#中二进制和流之间的各种相互转换
  6. [MySQL FAQ]系列 -- 账号密码包含反斜线时怎么办
  7. 此内容不能显示在一个框架中_.NET开发框架(二)框架功能简述
  8. 【天梯选拔月赛】参与者人数(并查集模版题!remember find_father写法!)
  9. 学校计算机房使用登记制度,瑶风中学计算机房管理制度
  10. Android:LayoutInflater(布局服务)的 简单介绍 使用方法解析
  11. 颜色中英文对照表颜色名字色彩名称
  12. 舵机控制 —— 一篇就够
  13. 哪个计算机无法做到双屏显示,笔记本电脑怎么实现双屏显示不同的内容
  14. [转] 海尔集团CEO张瑞敏演讲《人不成熟的几大特征》
  15. 根本原因分析(RCA)
  16. ai动漫生成软件哪个好?这篇文章告诉你
  17. 2021-08-23-Nginx安装与部署项目
  18. 简单实现mui-底部选项卡
  19. 无障碍键盘输入-搜狗输入法写数学公式
  20. 完美的实现九宫格锁屏

热门文章

  1. Linux操作系统下信号处理函数
  2. linux的定时任务有多耗资源,linux定时任务的一些相关操作汇总
  3. linux串口配置详解
  4. loj136 (最小瓶颈路,多次询问)
  5. apk反编译、smali修改、回编译笔记
  6. eclipse中添加svn插件
  7. usaco2.11Ordered Fractions
  8. android note2
  9. 当网站不允许上传ASP,CGI,CER等脚本文件时
  10. 好用的chrome插件总结