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-面向对象编程-包