天天看点

接口和包--Java学习笔记

interface定义:没有字段的抽象类

如上代码,方法没有具体化,在需要调用的类里面通过覆写来实现具体功能,多个类之间重新覆写的功能相互不影响。继承接口时,一定要覆写接口里的所有方法

普通类继承中,只能继承一个类,而接口可实现多继承

一个interface可以继承自另一个interface

abstract 定义实例字段 定义抽象方法 定义非抽象方法 but,只能extends一个class interface 可以implements多个interface 定义default方法 but,不能定义实例字段

当接口新增一个方法时,会涉及到修改全部子类,如果新增的是default方法,子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法

default和抽象类的普通方法是不太一样的,interface没有字段,default无法访问字段,而抽象类的普通方法可以访问实例字段。不过在interface中,default可以修饰具体方法

静态方法属于class不属于实例,可以直接通过类名来调用

尽管interface是纯抽象类,但它可以有静态字段,静态字段必须是final类型

实际上,因为interface的字段只能是​<code>​public static final​</code>​类型,所以我们可以把int前面的修饰符去掉

例如,在同一文件夹下,a写了一个person类,b也写了一个person类,c想用a和b的person类,这时候引入包(package)的概念

aa.java
bb.java

包可以是多层结构,用​<code>​.​</code>​隔开,例如​<code>​java.util​</code>​

:::tip

包没有父子关系,​<code>​java.util​</code>​和​<code>​java.util.zip​</code>​是不同的包,两者没有继承关系

:::

例如,如果想要定义包hello,则需要新建一个文件夹并命名为hello,文件夹下存放有hello包的Java文件

​<code>​hello\person.java​</code>​
​<code>​hello\main.java​</code>​

在一个class中,我们会引用其他的class,例如,Jay的​<code>​person.jay​</code>​类,如果要引用jjlin的​<code>​hello.jjlin​</code>​类,需要引入这个包

​<code>​hello\jjlin.java​</code>​
​<code>​person\jay.java​</code>​

除了引入包下的具体类,也可以使用*,把包下的所有class都导入进来(不辨认子包的class)

此方法可以导入一个类的静态字段和静态方法,此语法比较少用

Java编译器最终编译出的​<code>​.class​</code>​文件只是用完整类名,因此,在代码中,当编译器遇到一个class名称时:

如果是完整类名,就直接根据完整类名来查找这个class

如果是简单类名,依次按照下面的顺序依次查找

查找当前package是否存在这个class

查找import包是否含有这个class

查找​<code>​java.lang​</code>​包是否含有这个class

如果按照上面规则还无法确定类名,则编译报错

下面是一个例子

因此在编写class时,编译器会自动帮我们做两个import动作

默认自动import当前package的其他class

默认​<code>​import java.lang.*​</code>​

自动导入的是​<code>​java.lang​</code>​的包,但类似​<code>​java.lang.reflect​</code>​这些包还需要手动导入

为避免名字冲突,我们需要确定唯一的包名,推荐使用倒置的域名来确保唯一性

​<code>​org.apache​</code>​,本质上是​<code>​/org/apache/​</code>​路径下的class,下同

​<code>​org.apache.commons.log​</code>​

​<code>​com.jayden.sample​</code>​

子包就可以根据功能自行命名

注意不要和​<code>​java.lang​</code>​的包的类重名

​<code>​String​</code>​

​<code>​System​</code>​

​<code>​Runtime​</code>​

...

也不要和jdk常用的类重名

​<code>​java.util.List​</code>​

​<code>​java.text.Format​</code>​

​<code>​java.math.BigInteger​</code>​

​​参考链接-廖雪峰-Java-面向对象编程-接口​​

​​参考链接-廖雪峰-Java-面向对象编程-包​​