面向接口思想笔记

1,接口的本质

接口本身就是一钟完全抽象类,也就是说,里面的方法全部都是抽象方法,里面的变量全是常量


2,接口的定义

接口也是一个类,不过使用interface来进行声明,里面的方法与抽象方法一样,没有方法体

public interface Area {
   public abstract double area(); //可以省略:public abstract
   double perimeter();//Java会自动帮我们加:public abstract
   //int x=5;
   //public static final int MAX=5;
   public static final int MAX=5;
   
   public static final double PI=3.14;
}


3,接口的使用

1)接口本身是不能new对象的,只能当作引用来用,引用的实例为实现类对象

2)一个类要实现接口,必须把接口中所有的抽象方法全部实现,否则就要声明成抽象类。 实现类我们有时也把它称为子类。

3)接口本身上是类,它继承自Object,因此通过接口引用可以访问Object中的所有方法


public class Rectangle implements Area{
	
	private int width;
	private int height;
    
	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}
	public Rectangle() {
	}

	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	
	
	//实现接口中的抽象方法
	public double area(){
    	return width*height;
    }
	
	@Override
	public double perimeter() {
		return (width+height)*2;
	}
	
	@Override
	public String toString() {
		aa();
		return "一个矩形:"+width + ", " + height;
	}
	
	public void aa(){
		//x++;
		//MAX++;//WA:接口中的变量全是public static final的,不能重新赋值
		//MAX=10; //WA
		System.out.println("MAX=" + MAX);
	}
}


public class Circle implements Area {
	private int r;
	
	public Circle(int r) {
		this.r = r;
	}

	public Circle() {
		super();
	}
	@Override
	public double area() {
		return PI*r*r;
	}

	@Override
	public double perimeter() {
		return 2*PI*r;
	}

	@Override
	public String toString() {
		return "圆,半径:" + r;
	}
}

public class Rectangle implements Area{
	
	private int width;
	private int height;
    
	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}
	public Rectangle() {
	}

	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	
	
	//实现接口中的抽象方法
	public double area(){
    	return width*height;
    }
	
	@Override
	public double perimeter() {
		return (width+height)*2;
	}
	
	@Override
	public String toString() {
		aa();
		return "一个矩形:"+width + ", " + height;
	}
	
	public void aa(){
		//x++;
		//MAX++;//WA:接口中的变量全是public static final的,不能重新赋值
		//MAX=10; //WA
		System.out.println("MAX=" + MAX);
	}
}

4,单继承,多实现

为了避免C++中 的钻石问题(大概就是一个类可以继承多个类,从而导致使用多态的时候对象需要随机调用父类方法),java放弃了多继承,而是使用单继承多实现的方式。

单继承:也就是一个类只能继承一个类(但可以一个类可以被多个类继承)

多继承:一个类可以实现多个接口,但是每一个接口的方法都需要实现,不然只能声明为抽象类,抽象方法


public class Globe implements Area,Volume {
	private int r;
	public Globe(int r) {
		this.r = r;
	}
	public Globe() {
		super();
	}
	
	@Override
	public double volume() {
		return PI*4/3*r*r*r;
	}

	@Override
	public double area() {
		return 4*PI*r*r;
	}
	
	@Override
	public String toString() {
		return "一个球,面积:"+area()+",体积:"+volume();
	}
}



5,接口的多继承

一个接口可以继承多个接口,里面并不实现任何方法,唯一的作用就是整合接口,方便使用,在实现这个接口的时候,需要实现它的所有方法,同时它也可以解决一些多态问题。但是在实际开发当中,我们并不建议使用这种方式,而是使用专一的接口,因为这会破坏数据的封装性,大家都是专一的人,何必呢得意


//把两个父接口中的抽象方法全部继承过来了---综合接口
public interface AreaVolume extends Area,Volume {

}
public interface Area {
	public abstract double area();
	public static final double PI=3.14;
}
public interface Volume {
	public abstract double volume();
}


6,值得注意的一点

因为接口中的public是可以省略的,所以在实现它的方法的时候,就需要注意权限问题了,子类的权限是不能低于父类的,但是我们通常充分使用myeclipse,就不会出现问题


7,为什么需要接口?

讲了那么多,到底java何解需要接口呢

1)接口具有封装隔离功能。

2)系统灵活性增强,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉

3)约束,要实现它,就必须实现它的全部方法













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值