黑马程序员-设计模式,继承和抽象类

---------------------- android培训java培训、期待与您交流! ----------------------

设计模式:就是解决某一类问题行之有效的思想。

单例设计模式:
 解决问题:保证一个类在内存中的对象唯一性。
 应用:可以实现数据共享。


 思路:
  1,不让其他应用程序建立该对象。
  2,本类建立一个本类对象。
  3,对外提供一个方法让其他应用程序获取该对象。

 代码体现:
  1,将构造函数私有化。
  2,创建本类对象,私有并静态。
  3,定义静态方法返回该对象。

//饿汉式。
class Single
{
 private static Single s = new Single();
 private Single(){}
 //为什么要定义该方法呢?是为了控制对s这个对象访问。
 public static Single getInstance()
 {
  return s;
 }

}

 

//懒汉式.对象的延迟加载。面试的常见考点。

class Single
{
 private static Single s = null;
 private Single(){}
 public static Single getInstance()
 {
  if(s==null)
   s = new Single();
  return s;
 }
}
---------------------------

继承:
 好处:
  1,提高了代码的复用性。
  2,让类与类之间产生了关系,这也是多态的前提。

 弊端:
  打破了封装性。

 继承在java中的特点:
  1,java只支持单继承,不支持多继承。
   其实不支持多继承的原因是:因为调用的不确定性。
   所以java改良了多继承,用另一种方式来体现,叫做 多实现。
  2,java支持多层继承。
   方便于大家使用一个继承体系的功能。
   1,查阅顶层类中的功能(共性功能)。
   2,建立子类对象完成功能的调用。

 什么时候定义继承呢?
  当类与类之间有所属(is a)关系时,就可以继承。
  A是B中的一种:A就可以继承B。


子父类的出现成员的特点:
1,成员变量:当子父类中出现了同名变量时,可以用super来表示父类中的变量。
 一般不常见,因为父类都定义完了,子类不需要在重新定义。

2,成员函数:当子类和父类出现一模一样的函数时, 这时会有一个函数的特性:覆盖override(复写,重写)
 覆盖的注意事项:
  1,子类覆盖父类的方法,必须权限要大于等于父类。
  2,静态只能覆盖静态。(最好不要出现静态覆盖)

3,构造函数(子类的实例化过程):
 子类的所有构造函数默认都会访问父类中空参数的构造函数。
 原因:因为子类的构造函数的第一行都默认有一个条件隐式的语句 super();
 为什么子类的构造函数非要访问父类的构造函数呢?
 因为子类会获取到父类的数据,所以要先看父类是如何对该数据进行初始化的。

 如果父类中没有空参数构造函数,那么子类构造函数需要通过super语句访问父类中指定的构造函数。

super和this的特点:
 两个关键字的用法很相像。
 但是有本质的区别:
  this:代表的是本类的对象。
  super:代表的是父类的存储空间,也就是给父类加上了一个标识。

 
------------------------

final:最终化。
 特点:
 1,final可以修饰类,函数,变量。
 2,final修饰的类不能被继承。
 3,final修饰的函数不能被覆盖。
 4,final修饰的变量是一个常量,只能赋值一次。(这里指的赋值是显示赋值).
  其实就是给一些固定的常量值起个容易阅读的名称。
  该名称的规范是所有字母大写。如果由多个单词组成,中间用_连接

class Single
{
 private static final Single s = new Single();
 private Single(){}
 public static Single getInstance()
 {
  return s;
 }

}
 
---------------------------------------------

抽象类
 由来:
  事物不断向上抽取而来,在抽取功能的过程中,只抽取了功能的定义,而没有抽取的功能的实现。
  这时该功能就是抽象的。抽象功能只能定义在抽象类中。

 特点:
  1,抽象类中可以存储抽象方法。
  2,抽象类不可以实例化,因为调用抽象方法没意义。
  3,抽象类必须由自己的子类覆盖了所有的抽象方法后,其子类才可以实例化。


 练习:
 猫:叫:喵喵。
 狗:叫:汪汪。
 两个事物都具备叫的功能。
 向上抽取去一个父类 动物。
 动物本身就是一个不具体的事物,动物都具备叫的功能,但是怎么叫不确定,也就是不具体。
 这时动物就是一个抽象事物,叫就是一个抽象的功能。
 abstract class Animal
 {
  abstract void jiao();
 }

 class Cat extends Animal
 {
  public void jiao()
  {
   System.out.println("喵喵");
  }
 }

 class Dog extends Animal
 {
  public void jiao()
  {
   System.out.println("汪汪");
  }
 }

 抽象类涉及的问题:
  1,抽象类是一个父类?
   是,必须由子类去覆盖抽象方法才可以实例化。
  2,抽象类中是否有构造函数?
   有,虽然抽象类不可以实例化,但是其子类有可能实例化,抽象类中的构造函数是给子类进行初始化。
   
  3,抽象关键字不可以和哪些关键字共存?
   1,final 2,static,3,private.

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值