您的位置:首页 > 编程语言 > Java开发

Java面向对象基础

2017-10-18 22:55 246 查看

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
关键字。把类定义为不能继承的;或用于修饰方法,不能被子类重写。

【注】

实例变量也可以被定义为
final
,被定义为
final
的变量不能被修改。

被声明为
final
类的方法自动地声明为
final
,但是实例变量并不是
final


子类不能继承父类的构造器,但是父类的构造器带有参数的,必须在子类的构造器中显式地通过
super
关键字调用父类的构造器并配以适当的参数列表。

若父类有无参构造器,则不必须要在构造器中用
super
调用父类构造器。

重写(Override)

重写是子类对父类的允许访问的方法的实现过程重新编写。即外壳不变,核心重写。

* 重写方法不能抛出新的检查异常或比被重写方法申明更宽泛的异常。

* 重写的原理,在编译阶段,只检查参数的引用类型。在运行时,JVM指定对象的类型并且运行该对象的方法。

重写规则

访问权限不能比父类中被重写的方法的访问权限更低。如父类的一个方法被声明为
public
,则在子类中重写该方法不能声明为
protected


父类的成员方法只能被它的子类重写。

声明为
final
的方法不能被重写

声明为
static
的方法不能被重写,但能够被再次声明

子类和父类在同一个包中,则子类可以重写父类所有方法,除
private
final
的方法

子类和父类不在同一个包中,子类只能重写父类的
public
protected
的非
final
方法

重写的方法能抛出任何非强制异常,无论被重写的方法是否抛出异常。

但,重写的方法不能抛出新的强制性异常,或比被重写方法声明的更广泛的强制性异常,反之则可以。

构造方法不能被重写

如果不能继承一个方法,则不能重写这个方法。

重载(Overload)

重载是在一个类里面,方法名字相同,而参数不同,返回类型可以相同也可以不同。

每个重载的方法必须有一个独一无二的参数类型列表

重载规则

被重载的方法必须改变参数列表(参数个数或类型或顺序不一样)

被重载的方法可以改变返回类型

被重载的方法可以改变返回类型

被重载的方法可以改变访问修饰符

被重载的方法可以声明新的或更广的检查异常

方法能够在同一个类中或在一个子类中被重载

重写与重载区别

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

多态的实现方式

重写

接口

抽象类和抽象方法

抽象类

abstract class
定义抽象类

abstract
可以定义抽象方法。抽象方法没有定义,方法名后直接跟一个分号。

声明抽象方法会造成以下两个结果:

如果一个类包含抽象方法,则该类必须是抽象类

任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

【注】

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该方法。否则,从最初的父类到最终的子类都不能用来实例化对象。

总结

抽象类不能被实例化,如果被实例化,会报错。

抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类

抽象类中的抽象方法只是声明,不包含方法体,即不给出具体实现只是声明。

构造方法,静态方法不能声明为抽象方法。

抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象方法。

接口

接口不是类。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则必须声明为抽象类。

接口特性

接口中每一个方法是隐式抽象的,接口中的方法会被隐式地指定为
public abstract
,只需要使用
interface
,不必使用
abstract
.

接口的每一个方法也是隐式抽象的,声明时不需要
abstarct
关键字。

接口中可以含有变量,但是接口中的变量会隐式地指定为
public static final
。也可以含有
static
final
变量

接口中的方法只能由实现接口的类来实现接口中的方法。

接口没有构造方法

接口与抽象类区别

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

实现接口

类在实现接口的方法时,不能抛出强制性异常,只能在接口中或继承接口的抽象类中抛出该强制性异常。

一个类可以实现多个接口

接口允许多继承,如下

public interface Hockey extends Sports,Event


标识接口

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

package java.util;
public interface EventListener{}


主要用于以下两种目的

1. 建立一个公共的父接口

EventListener
接口,这是由几十个其他接口扩展的Java API,可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了
EventListener
接口,JVM就知道该接口将被用于一个事件的代理方案。

2. 向一个类添加数据类型

实现标记接口的类不需要定义任何接口方法,但是该类通过多态性变成一个接口类型。

b666
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: