##抽象类(Abstract class)
- 可以禁止对象的创建,一般在上层类中使用较多(需要继承关系实现多态性的应用,但该类并没有真正的实际逻辑含义)
- 抽象类中可以定义属性和构造器,语法和普通类相同
- 抽象类中可以定义普通方法,语法和普通类相同
- 抽象类中可以定义抽象方法,一般用于没有内容的方法可以定义为抽象方法 语法: [修饰符]abstract 返回类型 方法名称(参数)[异常抛出]
- 抽象类中可以没有抽象方法;如果类中存在抽象方法,该类必须定义为抽象类
- 类从父类继承方法后,必须将所有抽象方法覆盖(对抽象方法的覆盖又称为实现),如果没有实现所有的抽象方法则该类必须也声明为抽象类
##类和接口之间的关系
- 类和类:extends关键字,单继承
- 类和接口:implements关键字,多重实现
- 接口和接口:extends关键字,多重继承
###语法:
interface 接口名 extends 接口1,接口2,...{... ...}
package com.md9;
/*
1、定义接口使用interface关键字,语法与定义类相同
2、接口中没有属性和构造器
3、定义属性会加入隐含修饰符public static final
4、不能创建接口的对象,也没有属性需要初始化,所以对于接口,构造器没有任何的作用
5、接口中的方法必须是抽象的,会加入隐含修饰符public abstract
*/
interface IShape{
//String name="senven"; 公有静态常量
void draw();
void draw(String type);
}/*
类定义的完整语法
[修饰符] class 类名 [extends 父类] [implements 接口1,接口2,....]
实现特定的接口的类将获得在接口中定义的所有语法元素(常量和方法)
*/
class ICircle implements IShape
{ private String name;
public ICircle(){}
public ICircle(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void draw(){
System.out.println("draw a circle.");
}
public void draw(String type){
if(type.equals("name"))
System.out.println("draw a circle, name is"+name);
else
draw();
}
}
/*
参照ICircle完成IRectangle
*/
class IRectangle implements IShape
{
private String name;
public IRectangle(){}
public IRectangle(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void draw(){
System.out.println("draw a rectangle.");
}
public void draw(String type){
if(type.equals("name"))
System.out.println("draw a rectangle, name is"+name);
else
draw();
}
};
/*
接口类型的引用可以指向实现该接口的类的对象
*/
public class IShapeTest {
public static void draw(IShape s){
s.draw();
}
public static void draw(IShape s,String type){
s.draw(type);
}
public static void main(String[] args){
IShape s=null;
//s=new IShape();error
ICircle c=new ICircle();
draw(c);
IRectangle r=new IRectangle("my rectangle use interface");
draw(r,"name");
}
}