目录
前言
什么是接口呢,为什么要使用接口呢,我们知道在Java中只允许单继承,为了实现多继承,Java就引入了接口这个概念,什么是包呢,平常我们打开计算机的时候,要寻找一个文件,寻找那个文件所在的文件夹在哪里,其实包就是计算机文件夹的概念,在Java当中,我们编写的类,使用的接口,一些运作机制,就是存放在包里。好,下面我们开始学习接口和包的知识。
接口
接口在语法上与类相似,是一些常量和抽象方法的集合。需要注意的是:接口中的成员变量都是常量,成员方法都是没有方法体的抽象方法。注意:
- 接口中只能有常量、方法名;
- 接口中定义的方法不需要大括号,不需要写方法体,而是以分号结束;
- 接口没有构造方法,不能被实例化,只能被类实现或被另外的接口继承;
- 接口的方法只能是抽象的和公开的,不能有构造方法,Java接口可以有public、静态的和final属性。
接口与类相似点:
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别:
- 接口不能用于实例化对象,没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
声明接口
使用interface关键字声明接口,声明接口时,关键字interface前面要么是修饰符public,要么什么都没有,而不能使用protected或者private关键字;接口可以是多继承的,即一个接口可以用任意多个父接口。
[修饰符] interface 接口名 [extends 父接口名列表]{
//接口体,包括常量声明和方法声明
//常量声明
[public] [static] [final] 数据类型 常量名=常量值;
//方法声明
//[public] [abstract] 返回类型 方法名(参数列表);
}
各选项说明:
- 常量声明:接口中可以包含常量声明,也可以不包含,常量默认是public、static、final类型;
- 方法声明:接口中的方法只有返回值类型和方法名,没有方法体,接口的方法中都具有public和abstract属性,所以在声明方法时,可以省略前面的修饰符public和abstract。
例如:
interface Shape{ //定义一个接口Shape
double PI=3.14; //声明常量PI
double Mianji(); //声明一个Mianji方法
}
接口的实现
接口中只包含抽象方法,因此不能像一般类一样使用new运算符产生对象,使用关键字implements连接接口,语法格式为:
class 类名 implements 接口名{
//类主体
}
例如:
interface Shape{ //定义一个Shape接口
double PI=3.14; //声明一个double类型常量PI
double Mianji(); //声明一个double类型方法Mianji
}
class Yuan implements Shape{ //声明一个名为Yuan的类并用implements连接接口Shape
double r=10; //声明一个double类型常量r
public double Mianji() { //声明一个double类型的公共方法Mianji
return PI*r*r; //返回PI*r*r的乘积
}
}
public class myfirst {
public static void main(String[] args) {
Yuan y=new Yuan(); //创建Yuan类的实例对象y
System.out.println(y.Mianji()); //打印
}
}
运行结果为:314.0
接口的继承
接口也是可以被继承的,用关键字extends,和类的继承相似,语法格式如下:
Interface Interface2 extends Interface1
注意:当类实现了一个接口,而该接口继承了另一个接口时,则这个类必须实现这两个接口的所有方法。
实现多个接口时的常量和方法冲突问题
当实现接口时,则可以实现多个接口,这时就有可能出现常量或方法名冲突的情况,那该怎样解决呢,在解决这类冲突问题时,如果是常量冲突,则需要在类中使用全限定名(接口名、常量名)明确指定常量所属的接口;如果是方法冲突,则只需要实现一个方法即可。例如:
interface A{ //声明一个接口A
float PI=3.14f; //定义一个用于表示圆周率的常量PI
float getArea(); //定义一个用于计算面积的方法getArea
float getGirth(); //定义一个用于计算周长的方法getGirth
}
interface B{ //声明一个接口B
float PI=3.14158f; //定义一个用于表示圆周率的常量PI
float getArea(); //定义一个用于计算面积的方法getArea
}
class C implements A,B{ //声明一个C类并连接接口A,B
private float radius; //定义一个私有变量radius表示圆的半径
public void Circle(float r) { //声明一个Circle方法,将圆半径初始化为参数r的值
radius=r;
}
public float getArea() { //声明一个实现计算圆面积的方法getArea
float area=A.PI*radius*radius; //调用A接口中的PI常量
return area;
}
public float getGirth() { //声明一个计算圆周率的方法getGirth
float circuGirth=2*B.PI*radius; //调用B接口中的PI常量
return circuGirth;
}
}
public class myfirst {
public static void main(String[] args) {
C c=new C(); //创建C类的实例对象c
c.Circle(3); //调用实例对象c的Circle并赋值
float area=c.getArea(); //调用c对象的getArea方法,获得该对象的面积值
System.out.println("圆的面积为:"+area);
float girth=c.getGirth(); //调用c对象的getGirth方法,获得该对象的周长
System.out.println("圆的周长为:"+girth);
}
}
运行结果为:
圆的面积为:28.26
圆的周长为:18.84948
包
包的概念:
- 包是一种将相关类、接口或者其他包组织起来的集合体;
- 有助于避免命名冲突,同一个包中的类名不能重复,不同包中可以有相同的类名。
包的创建
创建自定义包,语法格式为:
package 包名;
注意:
- 创建了包之后,该文件中定义的任何类将属于指定的包;
- 创建包的语句必须为整个源程序的第一行。
package myPack1; //在当前文件夹下创建包(子文件夹myPack1)
package myPack2.sun; //在当前文件夹下创建包(子文件夹myPack2),再在其下创建子文件夹sun
在eclipse中创建包:在项目上点击右键,单击new下的Package。如果你不创建包,系统会默认生成一个default包。
导入包
要使用包中的成员,必须导入包,语法格式为:
import 包名.类名 //导入包中的一个特定类/接口
import 包名.* //导入包中所有类和接口
Java的系统包
系统包相当于函数库,包中提供了许多方法供用户使用
java.lang:包含所有的基本语言类,如基本数据类型、数学函数、字符串等,默认引入;
java.util:包含有用的实用功能类型,如日期类;
java.io:包含所有的输入输出类;
java.net:包含所有实现网络功能的类;
java.awt:包含图形用户界面设计类;
javax.swing:是java.awt包的扩充,包含更丰富的抽象窗口工具集;
java.applet:包含所有支持小应用程序Java applet的类;
java.awt.image:包含图像处理类。
常用工具包
java.lang包
Math类:
- Math.pow(double a,double b):返回以a为底,b为指数的幂值;
- Math.sqrt(double a):返回a的算术平方根;
- Math.round():采用四舍五入方式取得最接近的整数;
- Math.random():返回0到1之间的随机小数,要创建一个从x到y的随机数,例如:Math.round(Math.random()*(y-x))+x;
java.util包
Date类:Date类实际上只是一个包裹类,它包含的是一个长整型数据,表示的是从GMT(格林尼治标准时间)1970年1月1日00:00:00这一刻之后经历的毫秒数。
import java.util.*; //引入java.util包
public class myfirst {
public static void main(String[] args) {
Date d=new Date(); //创建Date实例对象d
System.out.println(d); //打印当前时间
}
}
运行结果为:
Thu Mar 04 16:37:33 CST 2021
最后
好了,关于Java接口和包的知识讲到这里了,谢谢观看!!!
我们下篇文章再见!!!
成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。