[修饰符] class SubClass extends SuperClass    按照这种关系,我们把SuperClass类称为父类或基类,把SubClass称为子类或派生类或拓展类。extends在英语中是扩展的意思,而不是继承。这

个关键字很好的体现了子类和父类的关系:子类是对父类的扩展,子类是一种特殊的父类。子类扩展了父类,将可以获得父类中所有的属性和方法,但是特别注意的是:java中的子类不能获得父类的构造

器。java.lang.Object是所有类的父类,Object要么是直接父类要么是间接父类。Object是默认父类,当你继承了一个父类时,Object就被取消继承了,好比构造方法一样。

继承是一种从一般到特殊的关系;提高了代码的复用性,提高软件开发效率;让类与类之间产生关系,多态的前提。





  • 子类与父类:

父类的私有成员子类不能继承到,Java只支持单继承,不支持多继承,一个类有且只有一个直接父类,那么问题来了:为什么不支持多继承?

多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: 

(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量

(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。



  • 子类对象实例化过程:

在继承操作中,对于子类对象的实例化:子类对象在实例化之前必须首先调用父类中的构造方法之后再调用自身的构造方法。







2个问题:若一个类的所有的构造方法使用private修饰,该类能不能有子类? 不可以

若一个类的所有的构造方法使用protected修饰,该类能不能有子类? 可以的

子类不能直接访问父类的私有成员;但是子类可以调用父类中的非私有方法来间接访问父类的私有成员。Person类中有私有字段name,Student继承Person

new Sudent().name; ×

new Student().getName(); √          代码如下:

public class Linkin extends Person {
public static void main(String[] args) {
Linkin linkin = new Linkin();
System.out.println(linkin.name);
System.out.println(linkin.getAge());
}
} // 定义一个父类
class Person {
public String name = "LinkinPark";
private int age = 25; public Person() { } public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public void test() {
System.out.println("这是完成不了的爱,,,");
} }



  • 覆写父类方法 

鸟和鸵鸟的例子,鸵鸟是鸟类中的一个特殊品种,所以鸵鸟类是鸟类的一个子类;但是鸟类有飞翔的功能,但是鸵鸟呢?飞翔的行为显然不适合于鸵鸟,此时怎么办?



子类拓展父类(子类是父类的一种特殊情况),主要是以父类为基础,然后添加属于自己的字段和方法。



当父类的某个方法不适合于子类本身的特征行为时就当覆写父类中应当改变的方法。



  • 方法的覆写

产生原因:当父类中某个方法不适合于子类时,子类出现父类一模一样的方法。判断必杀技:子类方法前加上@Override能编译通过,表明是方法的覆写。

调用被覆盖的父类方法:使用super.方法名(实参);

方法覆写时应遵循的原则(一同两小一大):(一同):方法签名必须相同;

 (两小):子类方法的返回值类型比父类方法的返回值类型更小或相等,子类方法声明抛出的异常应比父类方法申明抛出的异常更小或相等;

 (一大):子类方法的访问权限应比父类方法更大或相等。代码如下:

/**
*
* @version 1L
* @author LinkinPark
* @since 2014-10-28
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^重写父类的方法
*/
public class Ostrich extends Bird{ @Override
//子类方法前加上@Override能编译通过,表明是方法的覆写。
public void fly() {
System.out.println("可怜的鸵鸟,只能在地上跑,,,");
} //如果需要在子类方法中调用父类被覆盖的实例方法,可以使用super来调用
public void birdFly() {
super.fly();
} public static void main(String[] args) {
Ostrich bird = new Ostrich();
bird.fly();
bird.birdFly();
} } //定义一个普通的父类,其实中在这样子用来被继承的类设计中,方法的访问修饰符一般都使用protected
class Bird{
public void fly(){
System.out.println("一般的鸟儿都会在天上飞的,,,");
}
}

如果子类中包含了和父类同名的属性,那么在子类的实例方法中访问这个属性的时候,默认使用子类中的属性,也就是说子类的属性覆盖了父类的属性。注意:不是完全覆盖,系统在创建子类对象时,依然会为父类中定义的,被隐藏的变量分配内存空间。

要是子类中没有包含和父类同名的属性,在子类的实例方法中访问该属性的时候,则无须显式使用super或者父类名作为调用者。

如果在某个方法中访问名为a的属性,但是没有显式指定调用者,则系统查找a的顺序为:

1,查找该方法中是否有名为a的局部变量

2,查找当前类中是否包含了名为a的属性

3,查找a的直接父类中是否包含了a的属性,依次上溯a的所有父类,直到object

如果被覆盖的类的属性,在子类中可以通过父类名作为调用者来访问被覆盖的类的属性。





不管我们是否使用super调用来执行父类构造器中的初始化代码,子类构造器总会调用父类构造器一次。有this的话,就调用本类中的另外一个构造器,有super的话就调用父类中对应的构造器,要是2个都没有的话,就隐身调用父类的无参数构造器。代码如下:

public class Wolf extends Animal{

  public Wolf(){
super("狼人",3);
System.out.println("Wolf无参数构造器。。。");
} public static void main(String[] args) {
new Wolf();
}
} class Creature{
public Creature(){
System.out.println("Creature无参数构造器 。。。");
}
} class Animal extends Creature{ public Animal(){ } public Animal(String name){
System.out.println("Animal带一个参数的构造器。。。");
} public Animal(String name,int age){
this(name);
System.out.println("Animal带两个参数的构造器。。。");
}
}

最后以Overload( 重载)& Override(重写)的区别来结束:

No.

区别点

重载(overload)

覆写(override)

1

判断

规则

两同一不同

一同两小一大

2

权限

没有权限要求

被覆写的方法不能拥有比父类更严格的权限

3

范围

发生在一个类之中

发生在继承关系中

4

术语

overload

override

5

多态

编译时多态

运行时多态

linkin大话面向对象--继承的更多相关文章

  1. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  2. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

  3. linkin大话面向对象--类和对象

    我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...

  4. linkin大话面向对象--内部类

    内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...

  5. linkin大话面向对象--枚举

    枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...

  6. linkin大话面向对象--java关键字

    java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract  default  null  synchronized ...

  7. linkin大话面向对象--组合

    继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装.相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性.比如人有手一样,在人的类中增加一个手的属性. 何时 ...

  8. linkin大话面向对象--GC和jar包

    GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...

  9. linkin大话面向对象--接口

    接口(interface)的概念,掌握接口很重要,以后所有的编程都要面向接口编程.其实接口的内涵就7个字:规范和实现分离. 抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特 ...

随机推荐

  1. 解决linux 乌班图下使用eclipse创建类和其他各种操作进程卡死的问题的一种可能方法

    [转载]http://blog.csdn.net/u010652906/article/details/51626257Eclipse设置面板菜单可以点,左边面板不出现,创建类.创建包都会卡死的问题, ...

  2. UWP 手绘视频创作工具技术分享系列 - 全新的 UWP 来画视频

    从2017年11月开始,我们开始规划和开发全新的来画Pro,在12月23日的短视频峰会上推出了预览版供参会者体验,得到了很高的评价和关注度.吸取反馈建议后,终于在2018年1月11日正式推出了全新版本 ...

  3. 【mp3】洗脑循环了!龙珠超 自在极意功 【究极の圣戦】串田アキラ 背景纯音乐

    自在极意功情况下发动自带bgm 曲名:究极の圣戦 首先是视频: http://dwz.cn/6Tj2Lq 然后是mp3:度盘下载>> 老外翻唱: 个人翻唱:全民k歌>>

  4. python语言学习笔记整理

    什么是程序? 程序等于数据结构加算法,那么数据结构是一个静态的东西,算法是一个动态的东西,我们用一个新的语言编写这个程序,我们要考虑到语言也主要由数据结构和算法相关的东西,或静态或动态的东西来构成,所 ...

  5. 移动端吸顶(iOS与安卓)

    有的时候经常会遇到移动端吸顶效果,开始我也只是上网查了一下,分别有iOS和android两种样式,如下: /*!*Android*!*/ .head { position: fixed; top: 0 ...

  6. Linux系统Java环境安装配置

    jdk安装配置 首先下载JDK和JRE,这里你的需要看看你的Linux系统是多少位的,比如我的是64位的: 下载JDK并指定到Download目录,JRE同样操作: 解压并且配置环境: tar -zx ...

  7. CSS position: absolute、relative定位问题详解

    CSS2.0 HandBook上的解释:  设置此属性值为 absolute 会将对象拖离出正常的文档流绝对定位,而不考虑它周围内容的布局.假如其他具有不同 z-index 属性的对象已经占据了给定的 ...

  8. Java A+B(个人模版)

    JavaA+B: import java.io.*; import java.util.*; import java.math.BigInteger; import java.util.Scanner ...

  9. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  10. NYOJ201作业题

    作业题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过程, ...