Java面向对象(八)
Java面向对象(八)目录
[*]Java面向对象(八)
[*]
[*]二十四、abstract 关键字
[*]创建抽象类的匿名子类对象
[*]
[*]二十五、模板方法设计模式(TemplateMethod)
[*]二十六、接口(interface)
[*]26.1 接口简介:
[*]26.2 接口的定义和实现:
[*]26.3 接口的使用:
[*]26.4 接口的实现类的对象创建(例子)
[*]26.5 接口应用:代理模式(Proxy)
[*]26.6 特殊例子:
[*]26.7 Java8 接口新特性
[*]26.8 接口与抽象类的区别
二十四、abstract 关键字
[*]abstract 可以用来修饰的结构:类、方法。
[*]abstract 修饰类:抽象类。
[*]此类不能实例化。
[*]抽象类中一定有构造器,便于子类实例化时调用。(涉及:子类对象实例化的全过程)
[*]开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作。
[*]abstract 修饰方法:抽象方法。
[*]抽象方法只有方法的声明,没有方法体。
[*]包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
[*]若子类重写了父类中的所有的抽象方法后,此子类方可实例化。若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰。
[*]注意:
[*]abstract 不能用来修饰:属性、构造器等结构。
[*]abstract 不能用来修饰私有方法、静态方法、final 的方法、final 的类。
创建抽象类的匿名子类对象
public class PersonTest {
public static void main(String[] args) {
//非匿名的类非匿名的对象
Worker worker = new Worker();
method1(worker);
//非匿名的类匿名的对象
method1(new Worker());
//创建了一匿名子类的非匿名对象:p
Person p = new Person(){
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void breath() {
System.out.println("好好呼吸");
}
};
method1(p);
//创建匿名子类的匿名对象
method1(new Person(){
@Override
public void eat() {
System.out.println("吃好吃东西");
}
@Override
public void breath() {
System.out.println("好好呼吸新鲜空气");
}
});
}
public static void method1(Person p){
p.eat();
p.breath();
}
}
class Worker extends Person{
@Override
public void eat() {
}
@Override
public void breath() {
}
}
二十五、模板方法设计模式(TemplateMethod)
[*]抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
[*]解决的问题:
当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
[*]例子:
public class TemplateTest {
public static void main(String[] args) {
SubTemplate t = new SubTemplate();
t.spendTime();
}
}
abstract class Template{
//计算某段代码执行所需要花费的时间
public void spendTime(){
long start = System.currentTimeMillis();
this.code();//不确定的部分、易变的部分
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
}
public abstract void code();
}
class SubTemplate extends Template{
@Override
public void code() {
for(int i = 2;i <= 1000;i++){
boolean isFlag = true;
for(int j = 2;j <= Math.sqrt(i);j++){
if(i % j == 0){
isFlag = false;
break;
}
}
if(isFlag){
System.out.println(i);
}
}
}
}26.8 接口与抽象类的区别
NO.区别点抽象类接口1定义包含抽象方法的类主要是抽象方法和全局常量的集合2组成构造方法、抽象方法、普通方法、 常量、变量常量、抽象方法、(jdk8.0:默认方法、静态方法)3使用子类继承抽象类(extends)子类实现接口(implements)4关系抽象类可以实现多个接口接口不能继承抽象类,但允许继承多个接口5常见设计模式模板方法简单工厂、工厂方法、代理模式6对象都通过对象的多态性产生实例化对象7局限抽象类有单继承的局限接口没有此局限8实际作为一个模板是作为一个标准或是表示一种能力9选择如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局
[*]在开发中,常看到一个类不是去继承一个已经实现好的类,而是要么继承抽象类, 要么实现接口。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]