Java面向对象基础

来源:互联网 发布:怎么玩转淘宝千人千面 编辑:程序博客网 时间:2024/06/07 06:00

Java面向对象基础

源文件声明规则

  • 一个源文件中只能有一个public
  • 一个源文件可以有多个非public
  • 源文件名称与public类名保持一致

对象

  • 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象
    在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用。
  • Date deadline=new Date()
    表达式new Date()构造了一个Date类型的对象,且它的值是对新创建对象的引用。这个引用存储在deadline中。
    可以显式地将对象变量设置为null,表示这个对象变量没有引用任何对象。
  • 如果一个方法应用于一个值为null的对象上,会产生运行错误。
  • 局部变量不会自动初始化,必须通过调用new或设为null初始化。
    【注】Java对象变量与C++引用不同。
  • C++中没有空引用,且引用不能被赋值
  • Java的对象变量类似于C++的对象指针
    Date birthday;//Java等同于
    Date* birthday=new Date();//C++
  • Java中的null引用对应C++中的NULL指针
  • 所有Java对象存贮在堆中。

继承

  • Java的继承是单继承,即一个子类只能拥有一个父类。使用extends关键字
  • 但可以多重继承,即使用接口,使用implements关键字
  • 子类拥有父类非private的属性、方法
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
  • 所有的类都继承于java.lang.Object类,当没有显式地表示继承,则默认继承该类
  • super关键字。可以通过super关键字实现对父类成员的访问,用来引用当前对象的父类。
  • this关键字。指向自己的引用。
  • final关键字。把类定义为不能继承的;或用于修饰方法,不能被子类重写。
    【注】
    1. 实例变量也可以被定义为final,被定义为final的变量不能被修改。
    2. 被声明为final类的方法自动地声明为final,但是实例变量并不是final
  • 子类不能继承父类的构造器,但是父类的构造器带有参数的,必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
    若父类有无参构造器,则不必须要在构造器中用super调用父类构造器。

重写(Override)

重写是子类对父类的允许访问的方法的实现过程重新编写。即外壳不变,核心重写。
* 重写方法不能抛出新的检查异常或比被重写方法申明更宽泛的异常。
* 重写的原理,在编译阶段,只检查参数的引用类型。在运行时,JVM指定对象的类型并且运行该对象的方法。

重写规则

  • 访问权限不能比父类中被重写的方法的访问权限更低。如父类的一个方法被声明为public,则在子类中重写该方法不能声明为protected
  • 父类的成员方法只能被它的子类重写。
  • 声明为final的方法不能被重写
  • 声明为static的方法不能被重写,但能够被再次声明
  • 子类和父类在同一个包中,则子类可以重写父类所有方法,除privatefinal的方法
  • 子类和父类不在同一个包中,子类只能重写父类的publicprotected的非final方法
  • 重写的方法能抛出任何非强制异常,无论被重写的方法是否抛出异常。
    但,重写的方法不能抛出新的强制性异常,或比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写
  • 如果不能继承一个方法,则不能重写这个方法。

重载(Overload)

重载是在一个类里面,方法名字相同,而参数不同,返回类型可以相同也可以不同。
每个重载的方法必须有一个独一无二的参数类型列表

重载规则

  • 被重载的方法必须改变参数列表(参数个数或类型或顺序不一样)
  • 被重载的方法可以改变返回类型
  • 被重载的方法可以改变返回类型
  • 被重载的方法可以改变访问修饰符
  • 被重载的方法可以声明新的或更广的检查异常
  • 方法能够在同一个类中或在一个子类中被重载

重写与重载区别

区别点 重载方法 重写方法 参数列表 必须修改 一定不能修改 返回类型 可以修改 一定不能修改 异常 可以修改 可以减少或删除,不能抛出新的或更广的异常 访问 可以修改 只能降低限制

多态的实现方式

  • 重写
  • 接口
  • 抽象类和抽象方法

抽象类

  • abstract class定义抽象类
  • abstract可以定义抽象方法。抽象方法没有定义,方法名后直接跟一个分号。
    声明抽象方法会造成以下两个结果:
    1. 如果一个类包含抽象方法,则该类必须是抽象类
    2. 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
      【注】
      继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该方法。否则,从最初的父类到最终的子类都不能用来实例化对象。

总结

  • 抽象类不能被实例化,如果被实例化,会报错。
  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
  • 抽象类中的抽象方法只是声明,不包含方法体,即不给出具体实现只是声明。
  • 构造方法,静态方法不能声明为抽象方法。
  • 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象方法。

接口

  • 接口不是类。
  • 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
  • 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则必须声明为抽象类。

接口特性

  • 接口中每一个方法是隐式抽象的,接口中的方法会被隐式地指定为public abstract,只需要使用interface,不必使用abstract.
  • 接口的每一个方法也是隐式抽象的,声明时不需要abstarct关键字。
  • 接口中可以含有变量,但是接口中的变量会隐式地指定为public static final。也可以含有staticfinal变量
  • 接口中的方法只能由实现接口的类来实现接口中的方法。
  • 接口没有构造方法

接口与抽象类区别

区别点 抽象类 接口 方法 可以有方法体 只能由声明 成员变量 可以是各种类型 只能是public static final 静态方法 可以有静态方法和静态代码块 不能有静态方法和静态代码块 继承 一个类只能继承一个抽象类 一个类可以实现多个接口

实现接口

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中或继承接口的抽象类中抛出该强制性异常。
  • 一个类可以实现多个接口
  • 接口允许多继承,如下
public interface Hockey extends Sports,Event

标识接口

标识接口是指没有任何方法和属性的接口,仅仅表明它的类属于一个特定的类型,供其他代码测试。

package java.util;public interface EventListener{}

主要用于以下两种目的
1. 建立一个公共的父接口
EventListener接口,这是由几十个其他接口扩展的Java API,可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,JVM就知道该接口将被用于一个事件的代理方案。
2. 向一个类添加数据类型
实现标记接口的类不需要定义任何接口方法,但是该类通过多态性变成一个接口类型。

原创粉丝点击