Java深入探究关键字abstract的使用

目录
  • 1. 理解
  • 2. 作用
  • 3. 修饰类-抽象类
  • 4. 修饰方法-抽象方法
  • 5. 代码演示
  • 6. 经典题目
  • 7. 抽象类的匿名子类
  • 8. 应用-模板方法设计模式(TemplateMethod)

1. 理解

abstract:抽象的

2. 作用

  • abstract可以用来修饰类、方法。
  • 不能用abstract修饰变量、代码块、构造器。
  • 不能用abstract修饰私有方法、静态方法、final的方法、final的类。

3. 修饰类-抽象类

  • 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)。
  • 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作。
  • 抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。

4. 修饰方法-抽象方法

抽象方法只有方法的声明,没有方法的实现。以分号结束。

public abstract void talk(); 

含有抽象方法的类必须被声明为抽象类。反之,抽象类中可以没有抽象方法的。

  • 若子类重写了父类中的所有的抽象方法后,此子类方可实例化 。
  • 若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰。

5. 代码演示

public class AbstractTest {
	public static void main(String[] args) {
		//一旦Person类抽象了,就不可实例化
//		Person p1 = new Person();
//		p1.eat();
	}
}
abstract class Creature{
	public abstract void breath();
}
abstract class Person extends Creature{
	String name;
	int age;
	public Person(){
	}
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	//不是抽象方法:
//	public void eat(){
//
//	}
	//抽象方法
	public abstract void eat();
	public void walk(){
		System.out.println("人走路");
	}
}
class Student extends Person{
	public Student(String name,int age){
		super(name,age);
	}
	public Student(){
	}
	public void eat(){
		System.out.println("学生多吃有营养的食物");
	}
	@Override
	public void breath() {
		System.out.println("学生应该呼吸新鲜的没有雾霾的空气");
	}
}

6. 经典题目

public class Test1 {
    public static void main(String args[]) {
        A a = new B();
        a.m1();//B类中定义的m1方法
        a.m2();//A类中定义的m2方法
    }
}
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方法");
    }
}

7. 抽象类的匿名子类

public class PersonTest {
	public static void main(String[] args) {
		//匿名对象
		method(new Student());
		//非匿名的类非匿名的对象
		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();
	}
	public static void method(Student s){
	}
}
class Worker extends Person{
	@Override
	public void eat() {
	}
	@Override
	public void breath() {
	}
}

8. 应用-模板方法设计模式(TemplateMethod)

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

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

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

模板方法设计模式是编程中经常用得到的模式。各个框架、类库中都有他的影子,比如常见的有:

数据库访问的封装;

  • Junit单元测试;
  • JavaWebServlet中关于doGet/doPost方法调用;
  • Hibernate中模板程序;
  • SpringJDBCTemlateHibernateTemplate等;
abstract class Template {
   public final void getTime() {
      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 = 0; i < 10000; i++) {
        System.out.println(i);
        }
      }
}

到此这篇关于Java深入探究关键字abstract的使用的文章就介绍到这了,更多相关Java abstract内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java中abstract修改类的实例方法

    abstract是一种修饰类,经过修改的类会变成抽象类.除了类之外还可以修改方法,考虑到类的模块是小伙伴们常接触的,今天来小编带大家一起找寻使用abstract修改类的方法.这里需要我们先从abstract丁酉.特点.方法.注释进行学习,然后在实例中体会修改类的用法. 1.abstract定义 abstract关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. 2.特点 可以声明引用不能创建

  • Java abstract class 与 interface对比

    Java abstract class 与 interface对比 前言 abstract class和interface都是Java用来描述抽象体的,不知道是否有同学跟我一样对这两者的语法层面的区别以及如何选择这两者还存在着疑惑,反正接下来,让我详细介绍一下abstract class和interface. 理解抽象类 在面向对象的概念中,所有的对象都是通过类来描述的.但是反过来却不是这样,并不是所有的类都是用来描述对象的.因为这个类中可能没有足够的信息来描述一个具体的对象,这样的类就是抽象类

  • Java程序开发中abstract 和 interface的区别详解

    先给大家说下基本概念 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解.对于设计意

  • Java中的abstract和interface

    目录 1.简介 2.准则 2.1 接口优先于抽象类 2.2 接口中不应该实现方法 2.3 接口不应该用于导出常量 1.简介 abstract和interface关键字在Java中随处可见,它是Java三大特性封装.继承.多态特性的实现重要支柱之一.interface关键字用于定义接口抽象,其本质上是用于定义类型.定义类所具有的能力.但是新手往往错误的使用了abstract和interface,小捌其实也一样犯错误,这篇文章我们盘一盘interface接口和abstract抽象类的使用. 文章开始

  • JAVA抽象类和抽象方法(abstract)实例分析

    本文实例讲述了JAVA抽象类和抽象方法(abstract).分享给大家供大家参考,具体如下: 一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属性和方法中,有的是已经明确实现了的,有的还无法确定,那么我们就可以将其定义成抽象,在后日子类进行重用,进行具体化.这样,抽象类也就诞生了. 例如,定义了"动物"父类,其中&qu

  • java编程abstract类和方法详解

    抽象类和抽象方法常用知识点: (1)抽象类作为被继承类,子类必须实现抽象类中的所有抽象方法,除非子类也为抽象类. 也就是说,如果子类也为抽象类,可以不实现父类中的抽象方法.但是,如果有一个非抽象类 继承于抽象子类,需要实现抽象子类,抽象子类的抽象父类的所有抽象方法,新帐旧账一起算. (2)抽象类不能用final进行修饰. (3)抽象类不能被实例化,也就是说你用的时候不能通过new关键字创建. (4)抽象类中可以包含抽象方法和非抽象方法,抽象方法没有方法体,也就是没有具体实现, 只是定义了有什么功

  • Java 超详细讲解设计模式之中的抽象工厂模式

    目录 抽象工厂模式 1.什么是抽象工厂 2.抽象工厂模式的优缺点 3.抽象工厂模式的结构与实现 4.抽象工厂方法模式代码实现 5.抽象工厂模式的应用场景 6.抽象工厂模式的扩展 抽象工厂模式 前面文章介绍的工厂方法模式中考虑的是一类产品的生产,比如案例中的百事可乐工厂只能生产百事可乐,可口可乐工厂只能生产可口可乐,也就是说:工厂方法模式只考虑生产同等级的产品. 1.什么是抽象工厂 在现实生活中许多工厂是综合型的工厂,能生产多种类)的产品,就拿案例里面的可乐来说,在节日的时候可能会有圣诞版的可乐,

  • java abstract class interface之间的区别介绍

    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的.abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法.如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型. 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须

  • Java深入探究关键字abstract的使用

    目录 1. 理解 2. 作用 3. 修饰类-抽象类 4. 修饰方法-抽象方法 5. 代码演示 6. 经典题目 7. 抽象类的匿名子类 8. 应用-模板方法设计模式(TemplateMethod) 1. 理解 abstract:抽象的 2. 作用 abstract可以用来修饰类.方法. 不能用abstract修饰变量.代码块.构造器. 不能用abstract修饰私有方法.静态方法.final的方法.final的类. 3. 修饰类-抽象类 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实

  • 详解Java中native关键字

    一. 什么是Native Method    简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C.这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数.    "A native method is a Java method whose implementatio

  • Java中的关键字_动力节点Java学院整理

    Java中常用关键字: 与数据类型相关(10) 与流程控制相关(13) if: 表示条件判断,一般用法if(关系表达式),后跟else或{--} else: 条件转折,如if (关系表达式){语句块1}else{语句块2},如果关系表达式的值为true,则执行语句块1,否则执行语句块2. do--while--:do和while一般一起使用,用于表示循环语句.do{--}while(关系表达式)--:当关系表达式的值为true是继续循环. for:用于表示循环,for循环是最常使用的循环,格式f

  • Java中final关键字详解及实例

    final在Java中可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,如果你试图将变量再次初始化的话,编译器会报编译错误.  final的含义在不同的场景下有细微的差别,但总体来说,它指的是"不可变". 1. final变量 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量.final变量经常和static关键字一起使用,作为常量.用final关键字修饰的变量,只能进行一次赋值操作

  • JAVA深入探究之Method的Invoke方法

    前言 在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码. Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Access

  • 详解Java中static关键字和内部类的使用

    目录 一. static 关键字 1. static修饰成员变量 2. static修饰成员方法 3. static成员变量的初始化 二. 内部类 1. 实例内部类 2. 静态内部类 3. 局部内部类 4. 匿名内部类 一. static 关键字 在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的. 1. static修饰成员变量 static修饰的成员变量,称为静态成员变量 [静态成员变量特性]: 不属于某个具体的对象,是类的属

  • 全面了解Java中Native关键字的作用

    初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: public native int hashCode(); 为什么有个native呢?这是我所要学习的地方.所以下面想要总结下native. 一.认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这个语言来写即可.Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Ja

  • Java中instanceof关键字的用法总结

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: result = object instanceof class 参数: Result:布尔类型. Object:必选项.任意对象表达式. Class:必选项.任意已定义的对象类. 说明: 如果 object 是 class 的一个实例,则 instanceof 运算符返回 true.如果 object

  • 浅析java 的 static 关键字用法

    本篇浅析java中static的用法,主要五个方面:静态成员变量,静态方法,静态块,静态内部类,静态导包. 首先还是一张表格说一下静态对象和非静态对象的区别: 静态对象 非静态对象 归属 类共同具有 类的各个实例独立拥有 内存分配 内存空间上固定的 附属类分配 分配空间顺序 优先分配静态对象空间 优先分配静态对象空间,初始化也一样 1 静态变量,静态方法,静态块 静态对象,静态方法都是在原对象和方法上加上static关键字修饰,表示类可以直接调用这些,而不需要实例化后再调用.具有的好处是: 1-

随机推荐