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. MySQL慢SQL语句常见诱因

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11429037.html 1. 无索引.索引失效导致慢查询 如果在一张几千万数据的表中以一个没有索引的列 ...

  2. 【leetcode】948. Bag of Tokens

    题目如下: You have an initial power P, an initial score of 0 points, and a bag of tokens. Each token can ...

  3. yum工具入门

    一yum介绍 注意学完了yum之后,rpm的使用频率就少了.有些功能yum用起来不如rpm更方便. CentOS: yum, dnfYUM: Yellowdog Update Modifier,rpm ...

  4. 获取浏览器IP

    public static string GetLoginIP(HttpRequestBase request)        {            string loginip = " ...

  5. RzPageControl(pagecontrol)

    实现多标签的动态添加,切换,关闭 使用RzPageControl来实现多标签页使用菜单来打开标签页,通过标签页的caption来判断将标签页是否已经被打开过了.1.创建标签页,并判断是否是已经打开过的 ...

  6. jekins—持续集成

    json转换为Python的字典形式 Martin fowler:通过自动化的构建,编译-发布-自动化测试,尽早的发现集成的错误 持续集成的要素: 统一的代码库 自动构建编译 自动测试(单元测试) 每 ...

  7. [Repost] 探寻C++最快的读取文件的方案

    作者:BYVoid(https://www.byvoid.com/zhs/blog/fast-readfile) 版权协议:CC BY-NC-SA 3.0 Unported 在竞赛中,遇到大数据时,往 ...

  8. upc组队赛7 Star in Parentheses

    Star in Parentheses 题目描述 You are given a string S, which is balanced parentheses with a star symbol ...

  9. python之正则表达式【re】

    在处理字符串时,经常会有查找符合某些规则的字符串的需求.正则表达式就是用于藐视这些规则的工具.换句话说,正则表达式是记录文本规则的代码. 1.行定位符. 行定位符就是用来表示字符串的边界,“^”表示开 ...

  10. shell编程:字符串处理方式

    字符串处理方式 计算字符串长度 获取子串在字符串中的索引位置 计算子串长度 抽取(截取)字串 1.计算字符串长度,有两种方式 $ ${#string} $ expr length "$str ...