JavaSE——面向对象之关键字abstract

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 14:00   138   0

一、abstract

用法:用于修饰类、修饰方法

注意:不能用来修饰属性、构造器、私有方法、静态方法、final的方法、final的类

抽象类

1.此类不能被实例化;

2. 抽象类中一定有构造器,便于子类实例化调用;

3.开发中,都会提供抽象类的子类,让子类实例化,完成相关操作

抽象方法

1.抽象方法只有方法的声明,没有方法体;

2.包含抽象方法的类,一定是一个抽象类,反之,抽象类中可以没有抽象方法的。

abstract class Person{
    abstract public void eat();
}


abstract class Man extends Person{
    String name;
    int age;
    public void work(){
        System.out.println("男人努力工作");
    }
    abstract public void walk();
}


class GoodMan extends Man{
    public void eat(){
        System.out.println("好男人吃的多");
    }
    public void walk(){
        System.out.println("好男人走的快");
    }

}

抽象类的匿名子类

public class Test{
    public void static void main(String[] args){
        //1.创建Person的匿名子类对象
        Person p=new Person(){
            public void eat(){
                System.out.println("男人大口吃肉");
            }
            public void walk(){
                System.out.println("男人霸气的走路");
            }
        }
        method(p);    

        //2.创建Person的匿名子类的匿名对象
        method(
            new Person(){
                public void eat(){
                    System.out.println("女人减肥少吃饭");
                }
                public void walk(){
                    System.out.println("女人优雅走路");
                }                
            }    
        );    
    } 

    public void static method(Person p){
        p.eat();
        p.walk();
    }

}


abstract class Person{
    public abstract void eat();
    public abstract void walk();    
}

二、模板方法设计模式

定义:抽象类体现的是一种模板方法的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式

解决问题:

>当功能内部的一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现

>换句话说,在软件开发中实现了一个算法时,整体步骤是很固定的、通用,这些步骤已经在父类中写好了。但是某些部分易变,异变部分可以抽象出来,供不同子类实现。这就是一种模板模式。

package com.sgg.test;

public class TemplateTest { 
 public static void main(String[] args) {
  Template temp=new subTemplate();
  temp.spendTime();
 }
}

abstract class Template{
 /**
  * 某段代码花费的时间
  */
 public void spendTime() {
  long start=System.currentTimeMillis();
  code();
  long end=System.currentTimeMillis();
  System.out.println("花费的时间为:"+(end-start));
 }
 public abstract void code();
}

class subTemplate extends Template{
 public void code() {
  for(int i=1;i<100;i++) {
   System.out.print(i+",");
   if(i==99) {
    System.out.println(i);
   }
  }
 }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP