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关键字的更多相关文章

  1. java类继承总结一 父类类型与子类类型之间的转化问题(转)

    java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...

  2. C++ 类的继承五(类继承中的static关键字)

    //类继承中的static关键字 #include<iostream> using namespace std; /* 派生类中的静态成员 基类定义的静态成员,将被所有派生类共享 根据静态 ...

  3. Java&&As3.0 中的final 关键字

    Java和AS3.0关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.   可以修饰的对象:   fin ...

  4. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  5. 夯实Java基础(九)——final关键字

    1.前言 Java语言中的final关键字,想必大家都不是很陌生,我们自己用的最多的应该是用来定义常量吧,那么今天我们就来了解final这个关键字的用法,这个关键字还是非常简单的. final从字面意 ...

  6. java基本数据类型总结 类型转换 final关键字的用法

    java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...

  7. java重载与覆写

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...

  8. [改善Java代码]不要覆写静态方法

    建议33: 不要覆写静态方法 我们知道在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...

  9. [改善Java代码]推荐覆写toString方法

    建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...

  10. 菜鸡的Java笔记 第二十 - java 方法的覆写

    1.方法的覆写    当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写    范例:观察方法的覆写 class A{ public void ...

随机推荐

  1. LoadRunner系列之—-01 接口压力测试脚本

    LoadRunner中一般用如下函数进行接口测试: <一>. http或soap协议下的get请求接口,样例如下: web_url("integrated_query.jsp&q ...

  2. iOS 沙盒文件操作

    //获得document +(NSString *)documentsPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDoc ...

  3. STL vector的介绍(1)

    尝试下翻译STL里面的一些easy和算法.四级过了.六级刚考.顺便练练自己的英语水平.翻译的不好的地方请大神多多不吝赐教哈.方便我改正. 原来均来自:http://www.cplusplus.com/ ...

  4. Mysql Solution - Timeout error occurred trying to stop MySQL Daemon. Stopping MySQL: [FAILED] -

    错误例如以下: Timeout error occurred trying to stop MySQL Daemon. Stopping mysqld:                         ...

  5. 数据库建表参考(SQL Server)

      (1).字段设置为Not Null+Default Value.原因:减少三值判断,可为Null的字段要多判断null:另外,定长字段为null也占空间,变长字段为空字符串也是不占空间,所以设置成 ...

  6. hdu 2059 龟兔赛跑 (dp)

    /* 把起点和终点比作加油站,那总共同拥有n+2个加油站了, 每次都求出从第0个到第j个加油站(j<i)分别在加满油的情况下到第i个加油站的最短时间dp[i], 终于的dp[n+1]就是最优解了 ...

  7. Codeforces 757 D. Felicity's Big Secret Revealed 状压DP

    D. Felicity's Big Secret Revealed   The gym leaders were fascinated by the evolutions which took pla ...

  8. Python基础第七天

    一.内容 二.练习 练习1 题目:编写函数,函数执行的时间是随机的 图示: 代码: import time import random def func(): s = 1 l = [] for i i ...

  9. UI:数据的解析XML与JSON

    XML  和  JSON 语言  本篇博客来自互联网参考 XML 和 JSON 的互相转化 有属性的转化为对象,无属性的转化为字符串 节点的顺序性不可逆,XML有顺序,JSON 无顺序 XML 和 J ...

  10. bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】

    --因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...