java复习(五)面向对象(三)继承,关键字介绍,抽象类,接口区别

继承

     定义:继承就是子类继承父类的所有属性(即成员变量)和所有操作(即成员方法)。

注意:所有属性和所有操作,意味着即使是private修饰的变量或者private修饰的方法也可以继承,只不过子类访问不到而已,但是确实继承下来了。(包括构造函数也可以继承下来)。


了解继承之前,先来了解部分关键字,先说今天会用到的,其他关键字用到再说……


  关键字和保留字的区别:

       关键字:Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等。

       保留字:为java预留的关键字。现在还没用到,但是在升级版本中可能作为关键字。

  关键字:

      

                                      abstract                       
             1.用来声明抽象类,抽象方法,抽象属性。

             2.不能与final关键字共同使用。

                                       final
             1.final可以用来修饰类,方法,变量

             2.当用来修饰类时,表明不能被其他类继承

             3.当用来修饰方法时,明确这个方法不能被子类方法覆盖

             注:类的private方法会隐式地被指定为final方法。

             4.修饰变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
                                      static
             1.static方法:static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。但是在,非静态方法中可以使用静态方法。
           2.static变量:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
         3.static代码块:static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
        4.不允许修饰局部变量。切记。
        5。用对象是可以调用static成员方法或变量的,但是不建议这样使用。
                                    super和this功能

        1.普通的直接引用 ,意思就是,指向当前对象本身。(this)

        2.形参与成员名字重名,用this来区分                          (this)
        3.引用构造函数     调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。                                                             (this)
       1.普通的直接引用,与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。                                (super)
       2.子类中的成员变量或方法与父类中的成员变量或方法同名
       3.引用构造函数   super(参数):调用父类中的某一个构造函数(必须为构造函数中的第一条语句)。每个子类构造方法的第一条语句,都是隐含地调用super()。

保留字有:const ,goto ,friendly,sizeof。就不做介绍了。


        接下来将会为大家说明,抽象类,接口,普通类,之间继承的不同及它们本身的不同。(实现,也是继承的一种哦!!!)


               

                                              抽象类 

1.如果一个类使用abstract修饰的,那它就是一个抽象类,抽象类可以有抽象方法,也可以没有。

2.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

3.抽象类不能用来创建对象。
4.如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法,如果子类,没有实现父类的抽象方法,则必须将子类也定义为abstract类。
 
                                                接口
1.接口中的变量会被隐式地指定为public static final变量,并且只能是public static final。
2.方法会被隐式地指定为public abstract方法且只能是public abstract方法
3.允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
                                 接口类和抽象类之间的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
 3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5)抽象类存在构造函数,作用是提供给子类初始化父类的属性,接口不存在构造函数
 
 

  接下来给大家讲一下更深层次的设计上的区别:


下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

abstract class Door {
    public abstract void open();
    public abstract void close();
}

  或者:

interface Door {
    public abstract void open();
    public abstract void close();
}

 但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

  1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

  2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

  从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}

ok,博主心力交瘁,希望多多支持。。感激不尽。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_31071255/article/details/82391917
今日推荐