[public] interface 接口名[extends 父接口1,父接口2]{
[public][static][final] 数据类型 属性名=常量值;
[public abstract] 返回值类型 方法名([形参表]);
}
- 接口的属性必须用public static final修饰,是系统默认的,可部分省略或全部省略,但一般都写出final。
int MAXSIZE = 50; 等价于
public static final int MAXSIZE = 50;
- 接口的方法默认为public abstract,一般不写修饰符,可省略
- 接口中的方法都是抽象方法
- 接口定义后不能直接创建对象,必须由类实现接口后创建类的对象。每个类只能继承一个基类,但可以实现多个接口
- 类实现接口,就继承了接口中的所有成员变量和方法。由于接口中的方法都是抽象的,因此实现接口的类必须重写这些方法。
代码示例1:
/*
*定义名字为IDemo的接口
*/
public interface IDemo {
public int i=6;
public int getInt();
public void getDate(int id);
}
public class Demo implements IDemo{
public static void main(String[] args) {
int a=i;
}
@Override
public int getInt() {
return 0;
}
@Override
public void getDate(int id) {
// TODO Auto-generated method stub
}
}
一个类只能继承一个父类,但却可以实现多个接口
代码示例1:
interface IStart{
void start();
}
interface IStop{
void stop();
}
class Runner implements IStart,IStop{
@Override
public void start(){
}
@Override
public void stop(){
}
}
接口的出现是为了更好的实现多态,而多态的实现不一定需要依赖于接口,类的多态就是子类继承父类,并重写父类方法,从而获得不同的实现;而接口跟类基本一样,实现接口并实现接口方法,不同的类实现接口可以有不同的方式从而表现,这就是接口的多态性.
示例: 参考接口的应用.
代码实现部分:
//1.IRunner接口
public interface IRunner {
/**
* 启动前的准备
*/
void start();
/**
* 运行
*/
void run();
/**
* 停止
*/
void stop();
}
//2.ISwimmer接口
public interface ISwimmer {
/**
* 游泳
*/
void swim();
}
//3.person类
public class Person implements IRunner,ISwimmer{
@Override
public void swim() {
System.out.println("游泳!!!!!!!");
}
@Override
public void start() {
System.out.println("弯腰、蹬腿");
}
@Override
public void run() {
System.out.println("摆动手臂 person 跑起来 " );
}
@Override
public void stop() {
System.out.println("person 减速直到停止");
}
public void eat(){
System.out.println("吃饭@@@@@@");
}
}
//3.Car类
public class Car implements IRunner{
@Override
public void start() {
System.out.println("打火、挂档");
}
@Override
public void run() {
System.out.println("松离合、给油 、换挡、 car 跑起来");
}
@Override
public void stop() {
System.out.println("踩刹车、踩离合 car 停下来");
}
}
//4.Bird类
public class Bird implements IRunner{
@Override
public void start() {
System.out.println("蹬腿、跳");
}
@Override
public void run() {
System.out.println("摆动翅膀 Bird 飞起来 " );
}
@Override
public void stop() {
System.out.println("停止摆动翅膀 Bird 停下来 " );
}
public void fly(){
System.out.println("fly@@@@@@@");
}
}
//5.测试类
public class TestDemo {
public static void test(IRunner runner){
runner.start();
runner.run();
runner.stop();
if(runner instanceof Person){
((Person) runner).swim();
((Person) runner).eat();
}else if(runner instanceof Bird){
((Bird) runner).fly();
}
}
public static void main(String[] args) {
test(new Person());
test(new Car());
test(new Bird());
}
}
运行结果如下:
弯腰、蹬腿
摆动手臂 person 跑起来
person 减速直到停止
游泳!!!!!!!
吃饭@@@@@@
打火、挂档
松离合、给油 、换挡、 car 跑起来
踩刹车、踩离合 car 停下来
蹬腿、跳
摆动翅膀 Bird 飞起来
停止摆动翅膀 Bird 停下来
fly@@@@@@@
接口的多继承
接口完全支持多继承,既一个接口可以可以有多个直接的父接口,子接口扩展某个父接口,将会获得父接口中定义的所有方法、常量属性、内部类等。继承的多个父接口排在extends关键字之后,其间以英文逗号分隔.
有这样一个例子:超人具备飞、游泳和武功这些技能;现在有个超人类,他需要继承这几个技能
案例1:
public interface CanFight {
void fight();
}
public interface CanSwim {
void swim();
}
public interface CanFly {
void fly();
}
public interface ISuperman extends CanFight,CanSwim,CanFly{
}
public class Superman implements ISuperman {
@Override
public void swim() {
// TODO Auto-generated method stub
System.out.println("会游泳");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("会飞");
}
@Override
public void fight() {
// TODO Auto-generated method stub
System.out.println("会武功");
}
public static void main(String[] args) {
Superman superman=new Superman();
superman.swim();
superman.fly();
superman.fight();
}
}
查看Java API中List、Set、Collection接口,分析讲解说明.
用法如下
class EnclosingClass{
... ...
class ANestedClass{
... ...
}
}
内部类在外部类中有特权:内部类可以毫无限制地访问外部类的所有成员
案例2:
class Circle {
private double radius = 0;
public static int count =1;
public Circle(double radius) {
this.radius = radius;
}
class Draw { //内部类
public void drawSahpe() {
System.out.println(radius); //外部类的private成员
System.out.println(count); //外部类的静态成员
}
}
public static void main(){
Circle circle=new Circle(2);
Circle.Draw draw=circle.new Draw();
draw.drawSahpe();
}
}
输出结果:
1.0
1
成员内部类使用示例
然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
案例3:
public class OuterClass{
private int x=10;
class InnerClass{
int y=20+x;
}
public static void main(String[] args){
OuterClass oc= new OuterClass();
OuterClass.InnerClass ic=oc.new InnerClass();
System.out.println("Outer:x="+oc.x);
System.out.println("InnerClass:y="+ic.y);
}
}
输出结果:
Outer:x=10
InnerClass:y=30
注意:只有内部类才能够是私有的--安全机制,只有其外部类的方法才能够创建内部类对象。
用法如下
案例4:
public class People {
public static void main(String[] args) {
class Woman extends People { // 局部内部类
int age = 3;
public void getAge() {
System.out.println("age=" + age);
}
}
Woman woman=new Woman();
woman.getAge();
}
}
输出结果:
age=3
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的
用法如下
//普通类
class 类名 implement ActionListener{
public void actionPerformed(ActionEven e){
... ...
}
}
new 类名();
//匿名类
new ActionListener(){
public void actionPerformed(ActionEvent e){
... ...
}
};
案例5:
public class MyClick {
public interface OnClickListener{
void onClick();
}
public static void main(String[] args) {
OnClickListener onclickL=new OnClickListener(){
@Override
public void onClick() {
// TODO Auto-generated method stub
System.out.println("匿名内部类");
}
};
onclickL.onClick();
}
}
输出结果:
匿名内部类
注意事项
代码示例
public class Outter{
public static void main(String[] args){
Outter.Inner i=new Outter.Inner();
i.init();
}
static class Inner{
public void init(){
System.out.println("这里是静态内部类");
}
}
}
案例6
首先创建一个回调接口,让老板得告知干完活如何找到他的方式
public interface CallBackInterface{
void execute();
}
创建回调对象,就是老板本人,因为员工干完活后要给他打电话,因此老板必须实现回调接口
public class Boss implements CallBackInterface{
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("老板:收到了");
}
}
创建控制类,也就是员工对象,他必须持有老板的地址(回调接口)
public class Employee {
private CallBackInterface mCallBackInterface;
public Employee(CallBackInterface callBackInterface){
this.mCallBackInterface=callBackInterface;
}
public void doSome(){
for(int i=0;i<10;i++){
System.out.println("进度:"+i);
if(i==9){
System.out.println("员工:完成了");
}
}
mCallBackInterface.execute();
}
}
创建测试代码
public class Test {
public static void main(String[] args) {
Employee emp=new Employee(new Boss());
emp.doSome();
}
}
输出结果:
进度:0
进度:1
进度:2
进度:3
进度:4
进度:5
进度:6
进度:7
进度:8
进度:9
员工:完成了
老板:收到了
以上都是个人整理资料部分,有问题欢迎大家留言!如需转载,请注明出处!