JAVA基础--抽象类和接口
2017-7-7
一、抽象类
抽象类可以定义普通的成员变量 可以有构造方法 抽象类里面既可以有具体实现的方法也可以有抽象的方法
如果一个类继承了抽象类,必须重写其抽象方法 除非子类也声明为抽象类
package zhangyu201777;
public abstract class shape {
double c;
public shape(){
}
public shape(double c){
this.c=c;
}
abstract public double area();
}
package zhangyu201777;
public class Circle extends shape{
@Override
public double area() {
// TODO Auto-generated method stub
return 3.14*(c/2*3.14)*(c/2*3.14);
}
}
抽象类不能实例化
abstract final 不能同时修饰一个类 因为final不可继承 抽象类的目的就是为了子类的继承重写方法
抽象类的意义:
为其子类提供一个公共的类型
封装子类中重复的内容(成员变量和方法)
定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的
由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法的实现,用一个分号结尾,一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类。
如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类)
抽象类里面可以有抽象方法,也可以没有。抽象类不能实例化。
一个类继承抽象类后,必须重写其抽象方法,不同的子类可以有不同的实现。
二、接口
定义一个接口
接口是特殊的抽象类,即只包含抽象方法的抽象类
接口所有方法都是隐含的抽象的方法 不可以定义成员变量
创建接口时不能选“class” 选择“interface”
实现接口
与继承不同,一个类可以实现多个接口,实现的接口直接用逗号分隔
当然,该类需要实现这些接口中定义的所有方法
一个类可以通过implements关键字实现接口。一个类实现了某个接口后必然实现该接口中定义的所有方法
接口可以作为一种类型声明变量,一个接口类型的变量可以引用实现了该接口的类的对象
通过该变量可以调用该接口中定义的方法(具体的实现类提供了方法的实现)
接口的继承
接口之间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口。
子接口继承了父接口中定义的所有方法
public interface Runner {
int i=1;
//自动加上static final修饰词,不可以更改的常量,常量的名称所有字母都大写
}
package zhangyu201777;
public class AmericanCurl implements Hunnter {
public void run() {
System.out.println("AmericanCurl is running....");
}
public void hunt(){
System.out.println("hunt....");
}
}
接口和抽象类的区别
1、接口中所有的方法隐含都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法。
2、类可以实现多个接口,但是只能继承一个抽象类
3、类如果要实现一个接口,它必须要实现接口声明的所有方法,但是,类可以不实现抽象类声明的所有方法当然,在这种情况下,类必须声明成抽象的。
4、抽象类可以在不提供接口方法实现的情况下实现接口
5、java接口中声明的变量默认都是final的,抽象类可以包含非final的变量
6、java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public
7、接口是绝对抽象的,不可以被实例化,抽象类也可以被实例化
多态的意义
1、一个类型的引用在指定不同的对象时会有不同的实现
职员emp1 = new 讲师();
职员emp2=new 项目经理();
emp.1 完成工作();
emp.2 完成工作();
2、同样一个对象,造型成不同的类型时,会有不同的功能。
讲师teacher = new讲师();
企业技术顾问 consultant = teacher;
技术图书作者 aughor = teacher;
consultant.培训员工();
aughor.制作课件();
强制转换类型
父类的引用指向子类的对象 才能强制转换为子类的对象
可以通过强制转换将父类型变量转换为子类型变量,前提是该变量指向的对象确实是该子类型
也可以通过强制转换将变量转换为某种接口类型,前提是该变量指向的对象确实实现了该接口
如果在强制转换过程中出现违背上述两个前提,将会抛出ClassCastException
Instanceof关键词
在强制转型中,为了避免出现
ClassCastException,可以通过Instanceof关键词判断某个类型是否为指向类型
定义成员内部类
一个类可以定义在另一个类的内部,定义在类内部的类称为Inner,其所在的类称之为Outer
Inner定义在Outer类内部。通常只服务于Outer,对外部不具备可见性
Inner可以直接调用Outer的成员及方法(包括私有的)
创建内部类对象
一般情况下,Inner对象会在Outer对象中创建(构造方法或其他方法);Inner对象中会有一个隐式的引用指向创建它的Outer类对象。
public class Outer {
private int time;
private Inner inner;
Outer(int time){
this.time=time;
inner = new Inner();
inner.timeInc();
}
public void printTime(){
System.out.println(time);
}
class Inner {
public void timeInc(){
time++;
}
}
public static void main(String[] args){
Outer outer= new Outer(100);
outer.printTime();
}
//上面代码的输出结果为:101; 在Outer构造方法中创建的Inner对象会有一个隐式的引用指向创建
//它的Outer对象,调用Inner对象的timeInc方法,即会对Outer的time属性进行操作。
//一般成员变量都定义为private 通过创建get set 方法调用内部类
定义匿名内部类
public interface Action{
public void execute();
}
public class Main{
public static void main(String[] args){
Action actin = new Action(){
public void execute(){
System.ouy.println("Hello,World");
}
};
action.execute();
//代码中创建了实现Action接口的内部匿名类对象,并调用其execute方法
}
}
如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。