3.4抽象:abstract

3.4.1什么是抽象类?

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

3.4.2抽象类基础语法

①用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。

②如何定义抽象类?

class关键字前加abstract。不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

③抽象类无法被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。

④虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的。

⑤抽象类中可以定义抽象方法.

抽象方法的语法:只有方法的声明,没有方法的实现。在方法的修饰符列表中添加abstract关键字.并且抽象方法应该以“;”结束,不能带有“{}”。例如:public abstract void m1();

⑥抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中。含有抽象方法的类必须被声明为抽象类。

⑦一个非抽象的类继承抽象类,必须将抽象类中的抽象方法覆盖,实现,重写。

⑧抽象类不能被final修饰,抽象方法不能被final修饰。

3.4.3抽象类举例

abstract class A{

abstract void m1( );

public void m2( ){

System.out.println("A类中定义的m2方法");

}

}

class B extends A{

void m1( ){

System.out.println("B类中定义的m1方法");

}

}

public class Test{

public static void main( String args[ ] ){

A a = new B( );

a.m1( );

a.m2( );

}

}

3.4.4思考

①为什么抽象类不可以使用final关键字声明?

abstract类一定要能被继承,而final类不能被继承

②一个抽象类中可以定义构造器吗?

//abstract 不能用来修饰属性、构造器、private、final、static

public class TestAbstract1 {

}

abstract class A1{

//abstract int name;

//因为构造器不能被重写

//     public abstract A1(){

//     }

//子类不能覆盖(或重写)声明为private的方法的。

//private abstract void method1();

// final修饰的方法不能重写

//     public abstract final void method2();

//     public abstract static void method3();

//     static修饰的方法可以用类来调,但是abstract 的方法又没有方法体。。。

}

注意:

1)当我们设计一个类,不需要创建此类的实例时候,就可以考虑将其设置为抽象的,由其子类实现这个类的抽象方法以后,就行实例化。

2)抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此抽象方法。

3)若子类继承抽象类,并重写了所有的抽象方法,则此类是一个"实体类",即可以实例化。

4)若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象的!

③模板方法设计模式

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

解决的问题

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

编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

public class TestTemplate {

public static void main(String[] args) {

new SubTemplate().spendTime();

}

}

abstract class Template {

public abstract void code();

public void spendTime() {

long start = System.currentTimeMillis();

this.code();

long end = System.currentTimeMillis();

System.out.println("花费的时间为:" + (end - start));

}

}

class SubTemplate extends Template {

public void code() {

boolean flag = false;

for(int i = 2;i <= 10000;i++){

for(int j = 2;j <= Math.sqrt(i);j++){

if(i % j == 0){

flag = true;

break;

}

}

if(!flag){

System.out.println(i);

}

flag = false;

}

}

}

Java——抽象:abstract的更多相关文章

  1. java 抽象(abstract) 构造 静态(static) 总结--2017-03-02

    抽象类:不能实例化!子类继承抽象类, 实例化子类对象才可以调用, 多态的体现; 抽象方法:必须被重写才能被调用; 静态方法:类名直接调用,或者实例化对象调用; 构造方法:new后面的括号里面带参数,就 ...

  2. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  3. Java抽象类(Abstract Class)与接口(Interface)区别

    抽象类与接口比较 抽象类跟接口类似,都不能实例化,可能包含不需实现方法或已实现的方法. 抽象类可以定义一些不是静态或常量的字段,定义 public, protected, private访问级别的具体 ...

  4. Java抽象工厂模式

    Java抽象工厂模式 基本定义 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 ...

  5. Java抽象与接口的区别

    Java抽象与接口的区别 答案方式一.简单来说,1.接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 2.另外,实现接口的一定要实现接口里定义的所有 ...

  6. Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息

    Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...

  7. 抽象 abstract 和 接口 interface。 java 的 堆 和 栈。 参数传递(基本类型和普通对象的区别)

    package com.test; import com.test.Pro; //protected 修饰的成员只能在本包中和 继承该类的方法中使用 public abstract class Tes ...

  8. Java 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families ...

  9. JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别

    abstract修饰符可以修饰类和方法. (1)abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型(见后面实例),也就是编译时类型.抽象类就相当于 ...

随机推荐

  1. 浅谈CICD持续集成、持续部署的流程(转)

    Jenkins是一个比较流行的持续集成工具GitLab是存储镜像的镜像仓库由客户端将代码push推送到git仓库,gitlab上配置了一个webHook的东西可以触发Jenkins的构建.进入到Jen ...

  2. java基础学习笔记三(多态)

    多态? 多态是同一个行为具有多个不同表现形式或形态的能力. 存在的必要条件 继承 重写 父类引用指向子类对象 比如: Parent p = new Child(); 当使用多态方式调用方法时,首先检查 ...

  3. GA来源分析

    网页中广告素材分为:文字,图片和FLASH三种.针对这三种素材,2种有无参数的情况,新旧版GA收集到的结果为: 提醒:FLASH素材如果不加参数收集不到来源: 具体GA参数如下: 可参考:https: ...

  4. ContextLoaderListener vs DispatcherServlet

    In XML based Spring MVC configuration, you must have seen two declarations in web.xml file i.e. Cont ...

  5. Python--MySql(主键的创建方式、存储引擎、存储过程、索引、pymsql)

    主键的创建方式 1. create table stud( id int not null unique, name ) ); mysql> desc stud; +-------+------ ...

  6. ceph-pg

    版本:mimic https://192.168.1.5:8006/pve-docs/chapter-pveceph.html#pve_ceph_osds As a rule of thumb, fo ...

  7. Java数据类型简介

    Java数据类型 以下两行Java代码定义了两个整数:num1和num2: num1和num2是两个int类型的变量. int关键字指定它的后面是变量的名称,并表示数据类型整数,例如:10,15,70 ...

  8. windows配置环境变量

    windows配置环境变量 1.第一步 2.第二步 3.第三步

  9. 04、python的基础-->列表跟元组

    一.列表list 1.列表的新增元素(三种方法) >>>第1种方法(append 增加到最后): li = ['Peter','Henrry','Wode','鸭子','xiaoxi ...

  10. Qt 打开指定网站/系统文件夹

     本文转载自:http://blog.csdn.net/robertkun/article/details/7802977和http://hi.baidu.com/xyhouse/item/ccf ...