7.JAVA-类继承、覆写、final关键字
1.JAVA继承-extends
在java中,要想实现继承则使用extends关键字.
一般子类被称为派生类,父类称为基类(super)
extends需要注意的地方:
- java不允许多重继承(一个类只能继承一个父类,不能继承多个父类)、
- 派生类会继承基类所有属性和方法,但不能直接访问基类的private私有属性
- 实例化派生类时,会先去调用父类的构造方法构造基类,再实例化自身的属性类对象,最后才是调用自身类构造方法.
- 在派生类中,有个隐藏的super,表示为基类,所以我们可以通过它指定如何构造基类
1.1 示例1-super使用
注意:super必须放在构造方法首行使用,如果用户不使用super,则编译器默认调用super()来初始化父类
代码如下:
class Parent
{
public Parent()
{
System.out.println("Parent()");
}
public Parent(String str)
{
System.out.println("Parent(String str):"+str);
}
} class Derived extends Parent
{
public Derived()
{
super(""); //调用Parent(String str)初始化父类
System.out.println("Derived()");
}
} public class Test{
public static void main(String args[]){
Derived d = new Derived();
}
}
打印如下:

2.JAVA继承之方法覆写
当派生类覆写基类的方法时候,要遵守方法的权限,返回值以及参数都一致.
如果派生类覆写的基类方法是private的,则不能实现覆写功能,因为基类的private方法是不可见的(参考2.2示例)
派生类覆写方法,一般用于基类的方法不满足当前派生类功能实现时,才会去覆写.
2.1 示例1-覆写
代码如下:
class Parent
{
public void func(int i)
{
System.out.println("Parent::func()");
}
} class Derived extends Parent
{
public void func(int i) //覆写父类的func方法
{
System.out.println("Derived::func()");
}
} public class Test{
public static void main(String args[]){
Derived d = new Derived();
d.func(1);
}
}
2.2示例2-派生类private无法实现覆写
先来个正常覆写的代码:
class Parent
{
public void func()
{
System.out.println("Parent::func()");
}
public void print()
{
func();
}
} class Derived extends Parent
{
public void func() //覆写父类的func方法
{
System.out.println("Derived::func()");
}
} public class Test{
public static void main(String args[]){ Derived d = new Derived();
d.print();
} }
如下图所示,打印派生类的func():

然后将Parent的func()改为private:
private void func()
{
System.out.println("Parent::func()");
}
如下图所示,则打印基类的func():

2.3JAVA继承之如何通过派生类调用基类被覆盖的方法
在上面第1节,我们讲过派生类中有个隐藏的super,表示为基类.所以当基类被覆写的方法时,我们可以通过super来调用基类的方法.
示例-super调用基类方法
class Parent
{
public void func()
{
System.out.println("Parent::func()");
}
} class Derived extends Parent
{
public void func() //覆写父类的func方法
{
super.func(); //调用父类的func,如果不加super,则会出现一直递归
System.out.println("Derived::func()");
}
} public class Test{
public static void main(String args[]){
Derived d = new Derived();
d.func();
}
}
打印如下:

3.final关键字
在java中,final被称为终结器, final可以修饰变量,方法和类.
3.1 final修饰类
当final修饰类时,则表示该类为最终的,也就是说该类不能再有子类了,示例如下:
final class A { // 修饰该类不能有子类
}
class B extends A { // 错误的继承
}
3.2 final修饰方法
当在某个类的方法前面定义final时,则表示该方法不允许在子类里进行方法覆写(可以实现方法重载)
示例如下:
class A {
public final void fun() {} //此方法不允许子类覆写
public void fun(int i) {} //可以实现方法重载
}
class B extends A {
public void fun() {} // 错误:此处不允许覆写
}
3.3 final修饰变量
当final修饰变量时,则表示该变量为常量(类似C++中const).示例如下:
public static final String LICENSE = "GPL"; //修饰全局常量,定义常量时,名称需大写
下章学习: 8.JAVA-向上转型、向下转型
7.JAVA-类继承、覆写、final关键字的更多相关文章
- java类继承总结一 父类类型与子类类型之间的转化问题(转)
java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...
- C++ 类的继承五(类继承中的static关键字)
//类继承中的static关键字 #include<iostream> using namespace std; /* 派生类中的静态成员 基类定义的静态成员,将被所有派生类共享 根据静态 ...
- Java&&As3.0 中的final 关键字
Java和AS3.0关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. 可以修饰的对象: fin ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- 夯实Java基础(九)——final关键字
1.前言 Java语言中的final关键字,想必大家都不是很陌生,我们自己用的最多的应该是用来定义常量吧,那么今天我们就来了解final这个关键字的用法,这个关键字还是非常简单的. final从字面意 ...
- java基本数据类型总结 类型转换 final关键字的用法
java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...
- java重载与覆写
很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...
- [改善Java代码]不要覆写静态方法
建议33: 不要覆写静态方法 我们知道在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...
- [改善Java代码]推荐覆写toString方法
建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...
- 菜鸡的Java笔记 第二十 - java 方法的覆写
1.方法的覆写 当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写 范例:观察方法的覆写 class A{ public void ...
随机推荐
- NOI 2015 滞后赛解题报告
报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...
- 一个IM开源项目LiteTalk
http://blog.csdn.net/visualwind/article/details/6086631 http://blog.sina.com.cn/s/blog_54b5ea250101n ...
- mysql最新版中文参考手册在线浏览
MySQL是最流行的开放源码SQL数据库管理系统,具有快速.可靠和易于使用的特点.同时MySQL也是一种关联数据库管理系统,具有很高的响应速度和灵活性.又因为mysql拥有良好的连通性.速度和安全性, ...
- What to do about Eclipse's “No repository found containing: …” error messages?
As Mauro said: "you have to remove and re-add the Eclipse Project Update site, so that its meta ...
- 2016/4/1 jquery 与javascript关系 ①取元素 ②操作内容 ③操作属性 ④操作 样式 ⑤ 事件 点击变色
jQuery的min版本和原版功能是一样的,min版主要应用于已经开发成的网页中,而非min版 的文件比较大,里面有整洁的代码书写规范和注释,主要应用于脚本开发过程当中. JQuery是继protot ...
- 2016/2/25 1、<表单验证<form></form> 2、正则表达式 3、事件
1.<表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电 ...
- web框架和Django框架的初识
1,web框架的原理 1.1>c/s架构和b/s架构 1>c/s客户端模式 2>B/S浏览器模式-----web开发(web开发开的是B/S架构) 1.2>web开发的本质 1 ...
- EJB3.0
由于EJB2.0的复杂性,在Spring和Hibernate[1] 等轻量级框架出现后,大量的用户转向应用轻量级框架.在大家的呼声中, EJB 期待已久的EJB3.0规范终于发布了.在本文中将对新的 ...
- hdu 5119 (类似于划分数的状态定义) (DP中的计数问题)
题目描述:求n个数中异或值大于m的方案数有多少个? 设状态f[i][j]代表前i个数异或值为j的方案数有f[i][j]种,那么对于j来说要么选第i个数与前面的i-1个数中的某些数构成j,f[i-1][ ...
- 转载:百为STM32开发板教程之十二——NAND FLASH
http://bbs.21ic.com/icview-586200-1-1.html 百为STM32开发板教程之十二——NAND FLASH 参考资料:百为stm32开发板光盘V3\百为stm32开发 ...