抽象方法与抽象类
抽象方法与抽象类必须使用abstract修饰,有抽象方法的类只能被定义为抽象类,抽象类里可以没有抽象方法。
它们遵守的规则:
1 用abstract修饰,且抽象方法没有方法体(注意与空方法体的区别)。
2 抽象类不能实例化,即使该抽象类不包含抽象方法
3 抽象类包含属性、方法、初始化块、内部类、构造器、枚举六种类型。其构造器主要用于被子类调用。
4 包含抽象方法,或者父类包含抽象方法而没有实现,必须定义为抽象类。
abstract不能修饰属性和构造器,不能与static同时使用,也不能和private同时使用。
模版模式简单规则:
抽象父类只定义需要使用的某些方法,其余留给子类实现。
父类中包含需要调用其他系列方法的方法,这些调用既可以由父类实现也可以由子类实现,父类里提供的一些方法只是一些通用的算法,其实现也并不完全有自身实现,而必须依赖子类的辅助。
接口:
其修饰符可以是public或默认的包权限访问控制符。
接口中可以包含属性(只能是常量),方法(只能是抽象方法),内部类(包括内部接口)和枚举类定义
接口中的所有成员都是public权限(也可以省略不写),而接口中的属性则默认是public static final。
一个Java源文件中最多只有一个public接口,且与该源文件的主文件名相同。
实现接口的方法时只能使用public权限,因为子类重写父类方法或实现接口方法是访问权限只能更大或者相等。
面向接口编程的典型应用:简单工厂模式、命令模式。
内部类
内部类的作用
1 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包内的其他类访问该类
2 内部类成员可以直接访问外部类的私有数据,而外部类不能访问内部类的实现细节。
3 匿名内部类适用于创建那些只需要使用一次的类
内部类分为成员内部类和局部内部类,而局部内部类又分为非静态内部类和静态内部类,其在外部类中与其他静态,和非静态成员的使用类似。
使用示例:
class Out{
class In{
public In(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerInstance {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Out.In in = new Out().new In("测试");
}
}
匿名内部类格式
new 父类构造器(实参列表)|实现接口()
{
//匿名内部类的类体部分
}
匿名内部类必须继承一个父类或实现一个接口
匿名内部类使用规则:
1 不能使抽象类
2 不能定义构造器,因为没有类名,但可以定义初始化块,可以通过初始化块来完成构造器的工作。
使用实例:
interface Product{
public double getPrice();
public String getName();
}
public class TestAnonymous {
/**
* @param args
*/
public void test(Product p){
System.out.println("购买了一个"+p.getName()+",花掉了"+p.getPrice());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestAnonymous ta = new TestAnonymous();
ta.test(new Product()
{
public double getPrice(){
return 383.9;
}
public String getName(){
return "美女";
}
}
);
}
}
枚举类使用实例1:
public enum SeansonEnum
{
SPRING,SUMMER,FALLL,WINTER;
}
枚举类使用实例2:
public enum Gender
{
MAIL("男"),FEMAIL("女");
private String name;
private Gender(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}