黑马程序员--继承、抽象、接口(Java)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、继承(面向对象特征之一)
1.概述:
       1)、多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。
       2)、多个类可以称为子类,单独这个类称为父类或者超类。
       3)、子类可以直接访问父类中的非私有的属性和行为。
       4)、通过extends 关键字让类与类之间产生继承关系。


2.好处:
       1)、提高了代码的复用性。
       2)、让类与类之间产生了关系,提供了另一个特征多态的前提。


3.特点:
       1)、Java只支持单继承,不支持多继承。(因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢)。
       2)、Java支持多层继承。


4.总结:对于一个继承体系的使用,查阅顶层父类中的内容(父类中定义的是该体系中的共性功能),创建最底层子类的对象(创建子类对象可以使用更多的功能,基本的和特有的)。

 

5.子父类出现后,类中的成员都有了哪些特点:
                                         1)   、成员变量:如果子类中出现非私有的同名成员变量时,子类访问本类中的变量用this,访问父类中同名变量用super。
                                         2)、成员函数:当子父类中出现了一模一样的方法时,建立子类对象会运行子类中的方法,好像父类中的方法被覆盖掉一样。
                                                   所以这种情况是函数的另一个特性:覆盖(复写,重写)。
                                                   什么时候使用覆盖呢?当一个类的功能内容需要修改时,可以通过覆盖来实现。
                                                   覆盖注意事项:覆盖时,子类方法权限一定要大于等于父类方法权限;静态只能覆盖静态。
                                         3)、构造函数:在对子类对象进行初始化时,父类的构造函数也会运行。因为子类的每一个构造函数默认第一行有一条隐式的语句super();
                                                   注意:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
                                                   如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super(有参数)语句指定要访问的父类中的构造函数。
                                                   如果子类构造函数用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。


6.重载与重写区别:
                 1)、重载:只看同名函数的参数列表。
                 2)、重写:子父类方法要一模一样。


7.super()和this()用法注意:
                          1)、super()和this()是否可以同时出现在构造函数中?两个语句只能有一个定义在第一行,所以只能出现其中一个。
                          2)、super()或者this():为什么一定要定义在第一行?因为super()或者this()都是调用构造函数,构造函数用于初始化,因为初始化的动作要先完成。


8.final关键字:
             1.特点:
                   1)、final:最终,作为一个修饰符。可以修饰类,函数,变量。
                   2)、被final修饰的类不可以被继承。为了避免被继承,被子类复写功能;
                   3)、被final修饰的方法不可以被复写;
                   4)、被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,又可以修饰局部变量。
             2.原因:
                   其实这样的原因的就是给一些固定的数据起个阅读性较强的名称。
             3.规则:
                   加了final,程序更为严谨。常量名称定义时,有规范,所有字母都大写,如果由多个单词组成,中间用 _ 连接。

 

 


二、抽象类


1.抽象类由来:多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。


2.抽象定义:(看不懂)抽象就是从多个事物中将共性的,本质的内容抽取出来。


3.抽象类的特点:
              1)、抽象方法一定在抽象类中。
              2)、抽象方法和抽象类都必须被abstract关键字修饰。(被abstract修饰的函数不能同时被private、final、static修饰)。
              3)、抽象类不可以用new创建对象,因为调用抽象方法没意义。
              4)、抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。


4.抽象类与一般类的区别:
                      1)、抽象类和一般类没有太大的不同。该如何描述事物,还是如何描述事物。只不过,该事物中出现了一些不知道具体内容的方法部分。这些不确定的部分,也是该


                           事物的功能,需要明确出来,但是无法定义主体。通过抽象方法来表示。
                      2)、抽象类比一般类多了个抽象函数。就是在类中可以定义抽象方法。
                      3)、抽象类不可以实例化。
                      4)、抽象类虽然不能创建对象,但是也有构造函数。供子类实例化调用。
                      5)、抽象类中可以不定义抽象方法,这样做是不让类创建对象。

5.抽象类练习(代码):
/*
假如我们在开发一个系统时需要对员工进行建模,员工包含3个属性:
姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另外
还有奖金属性,请使用继承的思想设计出员工类和经理类。
*/
class AbstractTest
{
 public static void main(String[] args)
 {
  jingli j = new jingli("lisi",111,3000,500);
  j.work();
 }
}

abstract class yuangong
{
 private String name;
 private int id;
 private double pay;
 yuangong(String name,int id,double pay)
 {
  this.name = name;
  this.id = id;
  this.pay = pay;
 }
 public abstract void work();

}

class jingli extends yuangong
{
 private int bonus;
 jingli(String name,int id,double pay,int bonus)
 {
  super(name,id,pay);
  this.bonus = bonus;
 }
 public void work()
 {
  System.out.println("jingli work");
 }
}


 6.模板方法设计模式:解决的问题:当功能内部一部分实现时确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

7.模板方法练习(代码):
/*
需求:获取一段程序运行的时间。
原理:获取程序开始和结束的时间并相减即可。
获取时间:System.currentTimeMillis();
*/
abstract class GetTime
{
 public final void getTime()
 {
  long start = System.currentTimeMillis();
   
  runcode();
   
  long end = System.currentTimeMillis();
  
  System.out.println("毫秒:"+(end-start));
 }
 public abstract void runcode();

}
class SubTime extends GetTime
{
 public void runcode()
 {
  for(int x=0;x<2000;x++)
   System.out.print(x);
 }
}
class TemplateTest
{
 public static void main(String[] args)
 {
  SubTime gt = new SubTime();
  gt.getTime();
 }
}


 

三、接口


1.初期理解:可以认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。


2.格式:
      1)、是用关键字interface定义的, interface 接口名{}。   子类名 implements接口名{}。
      2)、接口中包含的成员,最常见的有全局常量、抽象方法。
           注意:接口中的成员都有固定的修饰符。
  成员变量:public static final   (公共的静态的不可以变的常量)
  成员方法:public abstract   (公共的抽象的方法。没有方法体只有方法名)
      3)、接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。


3.特点:
      1)、接口是对外提供的规则。
      2)、接口是功能的扩展。
      3)、接口的出现降低了耦合性。


4.抽象类和接口的区别:
                    1)、抽象类只能被继承,而且只能单继承;接口需要被实现,而且可以多实现。
                    2)、抽象类中可以定义非抽象方法,子类可以直接继承使用;接口中都有抽象方法,需要子类(全部)实现。
                    3)、抽象类使用的是  is a 关系;接口使用的 like a 关系。
                    4)、抽象类的成员修饰符可以自定义;接口中的成员修饰符是固定的。全都是public的。


4.知识拓展:
耦合性:开发之前先定义规则,A和B分别开发,A负责实现这个规则,B负责使用这个规则。至于A是如何对规则具体实现的,B不需要知道。这样这个接口的出现就降低了A和B直接耦合性。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值