linkin大话面向对象--继承
[修饰符] 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大话面向对象--继承的更多相关文章
- linkin大话面向对象--闭包和回调
先来理解2个概念:闭包和回调 什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...
- linkin大话面向对象--多态
java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...
- linkin大话面向对象--类和对象
我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...
- linkin大话面向对象--内部类
内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...
- linkin大话面向对象--枚举
枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...
- linkin大话面向对象--java关键字
java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract default null synchronized ...
- linkin大话面向对象--组合
继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装.相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性.比如人有手一样,在人的类中增加一个手的属性. 何时 ...
- linkin大话面向对象--GC和jar包
GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...
- linkin大话面向对象--接口
接口(interface)的概念,掌握接口很重要,以后所有的编程都要面向接口编程.其实接口的内涵就7个字:规范和实现分离. 抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特 ...
随机推荐
- Linux常用命令之文件处理命令
注:由于Linux操作系统有些目录不能轻易操作,特此建议大家在家目录home,或root.tmp目录下练习命令,以免带来不必要的损失 一.查询目录中的内容:ls 命令格式:ls [选项] [文件或目录 ...
- tomcat、weblogic、jboss的区别,容器的作用
一.tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,它是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心 ...
- VMware 设置共享目录
VMware 共享目录设置 1,选择"虚拟机"->"重新安装VMware Tools"2,挂载cdrom3,拷贝VMware-tool.tar.gz 到L ...
- 咫尺论坛|即速应用-微信小程序社区
咫尺论坛|即速应用-微信小程序社区 是一个集微信和支付宝小程序行业资讯.开发资源.技术交流于一身的大型小程序开发论坛,成立伊始便迅速聚集了一大批小程序开发爱好者,短时间内成为了国内领先的小程序开发者社 ...
- VS工程中添加c/c++工程中外部头文件及库的基本步骤
转载自 在VS工程中,添加c/c++工程中外部头文件及库的基本步骤: 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. 2.添加 ...
- NowCoder牛客练习赛7-A.骰子的游戏 B.购物-优先队列
A.骰⼦的游戏 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 在Alice和Bob面前的是两个骰 ...
- SG 函数 S-Nim
http://poj.org/problem?id=2960 S-Nim Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34 ...
- Java大数应用
1.大数加法 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void ...
- android狼人杀源码,桌面源码,猎豹快切源码
Android精选源码 android实现狼人杀app源码 android实现精心打造的Android基础框架源码 android热门电影的客户端源码 android 实现桌面的Launcher源码 ...
- c++(hash表)
hash表,有时候也被称为散列表.个人认为,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,但是数据查找十分麻烦:二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果.hash ...