相关文章推荐
威武的茶叶  ·  python把文件读入数组 ...·  1 年前    · 
爱喝酒的牙膏  ·  Bayesian generalized ...·  1 年前    · 
细心的冲锋衣  ·  API: why don't Python ...·  1 年前    · 
彷徨的小虾米  ·  "Attempt to invoke ...·  1 年前    · 

方法重写的注意事项

A:父类中私有方法不能被重写(因为父类私有方法子类根本就无法继承)

B:子类重写父类方法时(访问权限不能更低,最好就一致)

C:父类静态方法,子类也必须通过静态方法进行重写

子类重写父类方法的时候,最好声明一模一样。

方法重写(Override)和方法重载(Overload)的区别?方法重载能改变返回值类型吗?

方法重写:在子类中,出现和父类中一模一样的方法声明的现象。方法重载:同一个类中,出现的方法名相同,参数列表不同的现象。方法重载能改变返回值类型,因为它和返回值类型无关。

final关键字

在Java中声明类、属性和方法时,可使用关键字final来修饰,表示“最终”,final关键字为修饰符

修饰类,类不能被继承

修饰变量,变量就变成了常量,只能被赋值一次

修饰方法,方法不能被重写


多态

可以理解为一个事物的多种表现形式

之前的方法的重载、方法的重写,也是一种多态的表现形式

子类对象的多态性 (可以直接应用在抽象类和接口上,会在下面讲)

在Java中,子类的对象可以替代父类的对象使用

我们在之后的学习中会经常与多态打交道,比如:IO、集合、JDBC等等

使用前提

要继承、实现(接口)

要有子类对父类方法的重写,使子类具有不同的方法实现

对象多态性格式

将父类类型的引用指向子类的对象: 向上转型(upcasting)

看=左边,是父类的引用

看=右边,是子类的对象

向上转型

子类引用的对象转换为父类类型称为向上转型。通俗地说就是将子类对象转为父类对象。此处父类对象可以是接口

虚拟方法调用

通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法

注意

对象的多态性不适用于子类对象的新方法

子类对象的多态性,并不适用于属性

子类对象的多态性,并不适用于静态方法

向上转型与向下转型

向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是将子类对象转为父类对象。此处父类对象可以是接口

向下转型:父类引用的对象转换为子类类型称为向下转型

向上转型与向下转型

多态的好处

可以增强程序的可扩展性及可维护性,使代码更加简洁。

不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性

单例模式

一个类的对象的实例只有一个

如何设计

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private

不能用new操作符在类的外部直接产生类的对象

调用该类的某个静态方法以返回类内部创建的对象

静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的

分类

饿汉式    线程安全的

懒汉式    非线程安全的

抽象类abstract

抽象类就是一个不具体的类

用abstract关键字来修饰一个类时,这个类叫做抽象类,同理,用abstract关键字来修饰一个方法时,这个方法叫做抽象方法

抽象类和抽象方法必须用abstract关键字修饰

格式

abstract class 类名 {}

public abstract void eat();

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

抽象类不能实例化

因为它不是具体的。

那么,抽象类如何实例化呢?

按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

抽象类的子类

如果不想重写抽象方法,该子类是一个抽象类。

重写所有的抽象方法,这个时候子类是一个具体的类。

示例

抽象类——注意:

抽象类有构造器 (凡是类都有构造器)

抽象方法所在的类,一定是抽象类

抽象类中可以没有抽象方法

不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法

抽象类VS一般类:

相同点:

抽象类和一般类都是用来描述事物的,都在内部定了成员。

不同:

一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。

一般类可以被实例化。抽象类不可以被实例化。

一般类中不能定义抽象方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。

抽象方法——注意:

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

抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此抽象方法

若子类继承抽象类,并重写了所有的抽象方法,则此类是一个"实体类",即可以实例化

若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象的!

接口