Java基础-对象

java文件中是否可以有两个主方法 java中能有几个public方法_java中有两个相同方法会报错吗


上篇文结尾默默吐槽了下java的修饰符真麻烦。

修饰符中最常见有public,protected,private,修饰符的作用是可以用来限制访问作用域。

public

public就是公开的意思,相当于敞开大门,打开所有访问权限。定义为public的class类,interface接口是可以被其他任何类访问到的。需要注意的是一个java文件只能包含一个public类,这个public类必须要和文件名保持一致,非public的类可以有多个。

java文件中是否可以有两个主方法 java中能有几个public方法_java中有两个相同方法会报错吗_02

在class为public的情况下,定义为public的字段和方法也可以被其他类访问。

protected

protected用于继承关系,定义为protected的字段和方法,只可以被它的后代子类访问到,上文中有说过继承是通过extends关键字实现的。

java文件中是否可以有两个主方法 java中能有几个public方法_java中有两个相同方法会报错吗_03

这个叫做Tom的类继承了Student类,所以Student类中定义为protected的name字段,可以在Tom类中使用。而StudentNumber这个类没有继承关系,所以访问name字段提示报错。

private

private就是私有的意思,定义为private的字段和方法是无法被其他类访问到,那也就相当于这样的字段和方法只能在所在的类中被使用,换言之,private访问权限被限定在class的内部,而且与方法声明顺序无关。

java文件中是否可以有两个主方法 java中能有几个public方法_修饰符_04

第一个代码示例截图中有个方法是没有加任何修饰符的,这个方法的作用域是整个包。

package包这个是在java中的叫法,其实就是相当于文件夹,同一文件夹下不能有同名文件,不同文件夹中则是可以的。

假设现在没有包的区分,src下直接新建java文件,想再创建个Animal,就会有如下报错。

java文件中是否可以有两个主方法 java中能有几个public方法_修饰符_05

之前有说过,一个java文件只有一个public的class,没有包的话这个class不可以重复,并且非public的class也不可以重复。例如新建一个Animal2文件,保证了public的class不一致,但是在Animal2中写了个Animal中已经存在的Cat类,就有如下报错。

java文件中是否可以有两个主方法 java中能有几个public方法_java中有两个相同方法会报错吗_06

如此看来,可想而知,包的作用很大,至少对项目结构来说非常友好。

包作用域是指,可以在当前包的所有类中都可以访问,第一个代码示例截图中的hello方法没有规定修饰符,就相当于这个方法的作用域是当前包,包类的其他类是可以使用这个方法的。

java文件中是否可以有两个主方法 java中能有几个public方法_java文件中是否可以有两个主方法_07

多态

不同的包可以有相同的class,相同的方法名,其实在一个java文件中也是会出现多个相同发方法名。

在继承关系中,子类是可以定义一个与父类方法名完全相同的方法,这叫做覆写(Override),这样的特性称之为多态。

java文件中是否可以有两个主方法 java中能有几个public方法_java文件中是否可以有两个主方法_08

运行结果如下:

java文件中是否可以有两个主方法 java中能有几个public方法_java文件中是否可以有两个主方法_09

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

java文件中是否可以有两个主方法 java中能有几个public方法_字段_10

这里的Person就是声明类型,Teacher是运行时的实际类型。

如果父类中的方法不想被子类覆写,用final来限制。

java文件中是否可以有两个主方法 java中能有几个public方法_java文件中是否可以有两个主方法_11

final也可以修饰字段,这样的字段就变成了常量,和js中的const效果一样,不可修改。

当父类中没有方法,子类中仍要覆写就会报错,因为去掉父类的方法,就失去了多态的特性。

java文件中是否可以有两个主方法 java中能有几个public方法_父类_12

抽象类

如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法,把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句,因为这个抽象方法本身是无法执行的。因为无法执行抽象方法,因此这个类也必须申明为抽象类。使用abstract修饰的类就是抽象类,且无法实例化。这样一来,抽象类就没什么实际作用了,实际上它相当于定义了“规范”。

例如,Person类定义了抽象方法hello(),那么,在实现子类Student的时候,就必须覆写hello()方法。

这样的“规范”就让我想起来了ts中的interface,而ts其实就是为了弥补js的不规范,模仿其他强类型语言创造的,因此java中也是存在接口interface的。

在Java中,使用interface可以声明一个接口,所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)。一个具体的class去实现一个interface时,需要使用implements关键字。

java文件中是否可以有两个主方法 java中能有几个public方法_java中有两个相同方法会报错吗_13