首页 > java 基础---继承

java 基础---继承

继承

一,概述

a)         使用extends关键字可以让一个类继承另一个类,继承的类为子类,被继承的类是父类,子类会自动继承父类的所有方法和属性。

b)        继承使得类和类之间产生了关系

c)        子类可以使用super调用父类成员

d)        继承的最终目的就是提高代码的复用性。

e)         当发现一个类的功能不行时, 就可以派生子类增加方法。

什么时候定义继承呢?

当类与类之间有所属( is  a )关系时,就会继承。

一个类是一个另一个类中的一种。比如:苹果是水果的一种。

 

继承中子父类中成员的特点:

1,成员变量。

       当子父类出现同名变量时,可以使用super关键字区分。

       一般这种情况很少见,因为父类已经定义了,子类就没有必要在定义了。

       而且父类中的属性都是私有的,子类也无法直接访问。

 

 

2,成员函数。

       当子父类中出现一模一样的函数时,就出现了覆盖的操作。

       所谓覆盖,其实是子类对象在使用时,运行的是子类的函数。

       好像父类的被覆盖一样。所以就形象成为函数的覆盖,这是函数的另一个特性。

 

       什么时候使用覆盖呢?

       当父类的功能需要修改或者升级时,直接修改父类中的代码,并不利于后期的扩展和维护。

       可以定义一个子类对父类的功能进行覆盖。

       沿袭父类的功能定义,重写功能的主体内容。

       这样就提高扩展性和维护性。

 

       手机的例子:来电显示功能。

 

       覆盖的注意事项:

       1,子类覆盖父类必须权限大于等于父类的权限。

       2,静态只能覆盖静态。

3,构造函数

       子类的所有构造函数默认都会访问父类中空参数的构造函数。

       因为子类的所有的构造函数的默认第一行都有一个隐式的语句,super();

       为什么一定要调用父类构造函数呢?

       因为子类获得父类中的数据,需要父类先对数据进行初始化。

当父类中没有空参数的构造函数时,子类就没有办法使用隐式的super();访问父类中的构造函数,这时可通过手动用this或super语句来指定要访问的构造函数。

这就是子类实例化的过程。

 

this和super在用法上很相像,

       可以使用这两个关键字调用属性,调用行为,区分同名属性,区分同名行为。

       可调用构造函数。

但是有着本质的区别:

       this指向的是一个本类对象。

       super并没有指向一个对象,而仅仅代表父类的空间,应该算是父类空间的一个标识引用。

 

继承的弊端:打破了封装性。

解决方式可通过final关键字完成。

final关键字的出现其实是提高程序的严谨,让不允许改变的内容固定下来。

特点:

1,  final修饰类,函数,变量(类变量,实例变量,局部变量)

2,  final修饰的类不可被继承。

3,  final修饰的方法不可被复写。

4,  final修饰的变量是一个常量,只能被赋值一次。

 

对于参与运算不变的数据,通常都会定义一个常量将该数据记录下来。

目的是给该数值起一个名字,方便使用和阅读。

常量定义规范:所有的字母都大写,多个单词用_相连。通常成员常量都是静态的。

 

如何设计好继承

1,  把通用操作与方法放在父类中,因为一个父类可以有好几个子类。如果是通用的操作,放在父类中,带来的好处是多方面的,一是,避免代码重复,二,避免了人为因素导致的不一致。

2,  不要使用受保护字段,也就是Pritected字段。

3,  尽管类的继承给开发带来了好处和方便,但如果不希望自己的类在被扩展,也就不希望再产生子类时,可以在类的前面加上final。

 

 

 

 

向上转型

当用一个父类类型的变量在记录子类对象时,子类对象会自动提升为父类的类型。

 

 

 

 

 

设计模式

       解决某一类问题行之有效的方式;java中共有23种。是一种解决问题的思想。

单列模式

       保证一个类在内存中只有一个对象,也就保证了对象的唯一性。

 

什么时候要保证一个类中只有一个对象呢?

       在java中只要建立对象就能获取对象中的所有的方法和属性。

思路:

1,  不让其他程序建立该类的对象。

2,  在本类中建立一个本类对象。

3,  将自定义的对象对外提供出去,让其他程序访问。

 

步骤,

1,  将构造函数私有化,不提供其他程序创建对象的初始化。

2,  new一个本类对象,私有并静态。

3,  定义一个公有的静态方法返回该对象,让其他程序可以调用。

 

饿汉式

 

public class SingleDemo {

    private static SingleDemo s= new SingleDemo();

    private SingleDemo(){}

    public static SingleDemo getInstance()

    {

       return s;

    }

}

 

懒汉式;属于对象的延迟加载,对于多线程并发访问getInstance方法,会出现安全隐患。

class SingleDemo

{

    private static SingleDemo s=null;

    private SingleDemo(){}

    public static SingleDemo getInstance()

    {

       if(s==null)

           s=new SingleDemo();

       return s;

    }

}

 

优化了安全问题                          我不懂的地方。

class SingleDemo {

    private static SingleDemo s = null;

 

    private SingleDemo() {

    }

    public static SingleDemo getInstance() {

       if (s == null) {

           synchronized (SingleDemo.class) {

              if (s == null)

                  s = new SingleDemo();

           }

       }

       return s;

    }

}

 

模板设计模式

定义功能时,一部分功能是确定的,而一部分功能确定不了。确定的功能还要预先使用不确定的部分。

这时可将不确定部分对外暴露,由子类去实现。

 

 

转载于:https://www.cnblogs.com/liuhongliang1234/p/3430566.html

更多相关:

  • 假如 父类 int num =7;子类 int num =9;父类是否会被子类所覆盖? 给你看两个例子: 第一个例子:   第二个例子:   这两个例子的区别只有一句话   由此证明了子类从父类继承的时候  如果有同名的成员变量 默认情况下 父类的成员变量是被屏蔽的   如果你非要调用父类的成员变量  请使用super关键字 转...

  • 1.访问控制(笔试题)1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问权限 本类 本包中的类 子类 其他包的类-------------------------------------------------...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...