[修饰符] 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. 数据结构4——浅谈DancingLinks的思想及应用

    在学习DancingLinks之前,我们先来回顾一下我们以前学过的回溯法. 我们学习基础的回溯法的时候,我们都是先判断是否达到解,然后继续搜索. 对于搜到的下一个点,将他标记为使用过( vis[i]= ...

  2. ATM机运行代码

    实现代码: import java.util.Scanner; public class Atm { public static void main(String[] args) { // TODO ...

  3. [转载]常见slave 延迟原因以及解决方法

    一  序言在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警: 点击(此处)折叠或打开 check_ins_slave_lag (err_cnt:1)critical-slav ...

  4. es6的常用语法

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  5. Java与算法之(12) - 老鼠再闯迷宫(广度优先算法)

    贪吃的小老鼠又回来了,这次有什么新的办法吃到奶酪呢? 规则不变,只能上下左右在格子内移动. 因为上次的深度优先算法让老鼠走了不少冤枉路,这次老鼠带来了帮手探路鼠.探路鼠的使用规则如下: 小老鼠按右.下 ...

  6. Codechef:Path Triples On Tree

    Path Triples On Tree 题意是求树上都不相交或者都相交的路径三元组数量. 发现blog里没什么树形dp题,也没有cc题,所以来丢一道cc上的树形dp题. 比较暴力,比较恶心 #inc ...

  7. 51 nod 1628 非波那契树

    原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1628 花了一个早上+半个下午终于把这题切掉了…… (膜出题人) ...

  8. Linux编译安装Mariadb数据库

    一.安装cmake cd /usr/local/src tar zxvf cmake-2.8.12.1.tar.gz cd cmake-2.8.12.1 ./configure 注意报错需要安装gcc ...

  9. 94、存储库之MongoDB、mysql

    本篇导航: 简介 MongoDB基础知识 安装 基本数据类型 CRUD操作 其它 存储库之mysql   一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库1.易用性 MongoDB是 ...

  10. C/C++之循环结构

    C语言中提供四种循环,即goto循环.while循环.do…while循环和for循环.四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经 ...