Java中定义抽象属性的示例详解
这篇文章主要给大家介绍了关于在java中如何定义一个抽象属性示例详解的相关资料,需要的朋友可以参考下
前言
本文主要给大家介绍的是在java中定义一个抽象属性的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:
Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给子类。由于Java不支持抽象属性,如果你试图将类属性标记为抽象,将会得到一个编译时错误。
在本教程中,我们将介绍两种定义抽象属性的方法,这些抽象属性可以由子类进行设置,而且不使用Abstract 关键字。
实用案例
假设我们想要实现一个记录事务的日志模块,用来记录特定事务的信息。我们希望这个模块是抽象的,这样我们可以实现不同的日志记录方式,例如:记录到文件或数据库中。
我们的引擎使用预定义的分隔符来连接日志中的信息,并存储在一个String中。具体应该使用哪个分隔符,这将取决于日志记录的规则,例如可以用字符“,”对日志记录中不同部分的信息进行分割。
因此,分隔符看起来对我们的引擎是抽象的,需要由每个日志记录规则明确定义。
下面我提供两种方式,来实现把分隔符的定义委托给子类。
在抽象类中定义带参数的构造函数
在抽象类中定义动态属性的第一种方法是:定义一个参数的构造函数。
所以我们可以这样实现这个引擎:
// TransactionManager.java public abstract class TransactionManager { private String separator; public TransactionManager(String separator) { this.separator = separator; } public abstract void writeTransaction(String result); public Transaction startTransaction() { Transaction transaction = new Transaction(System.currentTimeMillis()); return transaction; } public void endTransaction(Transaction t) { long processingTime = System.currentTimeMillis() - t.getStartTime(); StringBuilder logBuilder = new StringBuilder(); logBuilder.append(t.getStartTime()); // Notice the use of this.separator logBuilder.append(this.separator); logBuilder.append(processingTime); logBuilder.append(this.separator); logBuilder.append(t.getData()); String result = logBuilder.toString(); writeTransaction(result); } }
在抽象类中定义带参数的构造函数时,子类将会被强制定义自己的构造函数并调用super()
。 这样我们就能强制separator属性依赖于已使用的日志记录机制。
注意:我们的引擎实现了所有日志机制共有的静态行为:startTransaction()
, endTransaction()
,同时将动态行为writeTransaction()
交给子类去实现。
现在,如果我们想要创建一个事务管理器,用它将日志内容记录到一个文件中,那么可以这样去定义:
public class TransactionManagerFS extends TransactionManager{ // The IDE forces you to implement constructor. public TransactionManagerFS(String separator) { super(separator); } @Override public void writeTransaction(String result) { System.out.println("The following transaction has just finished: " ); System.out.println(result); } }
接下来做一个测试,看看代码是怎样工作的
public static void main(String[] args) throws InterruptedException { // we pass the separator explicitly in the constructor TransactionManager transactionManager = new TransactionManagerFS(","); Transaction transaction = transactionManager.startTransaction(); transaction.setData("This is a test transaction !!"); Thread.sleep(1500); transactionManager.endTransaction(transaction); }
输出:
The following transaction has just finished: 1502179140689,1501,This is a test transaction !!
通过getter方法传递分隔符
另外一种实现动态属性的方法是:通过定义一个抽象的getter方法,该方法根据当前的日志记录机制来检索所需的分隔符。在我们的引擎中,当需要要使用分隔符时,可以通过调用这个getter方法得到。
接下来我们将引擎修改成这样:
public abstract class TransactionManager { public abstract String getSeperator(); public abstract void writeTransaction(String result); public Transaction startTransaction() { Transaction transaction = new Transaction(System.currentTimeMillis()); return transaction; } public void endTransaction(Transaction t) { long processingTime = System.currentTimeMillis() - t.getStartTime(); StringBuilder logBuilder = new StringBuilder(); logBuilder.append(t.getStartTime()); // Notice the use of getSeparator() logBuilder.append(getSeperator()); logBuilder.append(processingTime); logBuilder.append(getSeperator()); logBuilder.append(t.getData()); String result = logBuilder.toString(); writeTransaction(result); } }
另外修改TransactionManagerFS如下:
public class TransactionManagerFS extends TransactionManager{ @Override public String getSeperator() { return ","; } @Override public void writeTransaction(String result) { System.out.println("The following transaction has just finished: " ); System.out.println(result); } }
然后,修改main以使用新的实现,并确保得到正确的结果。
public static void main(String[] args) throws InterruptedException { // The separator is defined implicitly using getSeparator() method of the manager TransactionManager transactionManager = new TransactionManagerFS(); Transaction transaction = transactionManager.startTransaction(); transaction.setData("This is a test transaction !!"); Thread.sleep(1500); transactionManager.endTransaction(transaction); }
输出:
The following transaction has just finished: 1502179140689,1501,This is a test transaction !!
总结
Atas ialah kandungan terperinci Java中定义抽象属性的示例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.
