Java抽象類(lèi)和接口的區(qū)別詳情
1、抽象類(lèi) vs 接口?
- 方法類(lèi)型: 接口只能有抽象方法。抽象類(lèi)可以有抽象和非抽象方法。從 Java 8 開(kāi)始,它也可以有默認(rèn)和靜態(tài)方法。
- 最終變量: 在 Java 接口中聲明的變量默認(rèn)是最終的。抽象類(lèi)可能包含非最終變量。
- 變量類(lèi)型: 抽象類(lèi)可以有final、
non-final、靜態(tài)和非靜態(tài)變量。接口只有靜態(tài)和最終變量。 - 實(shí)現(xiàn): 抽象類(lèi)可以提供接口的實(shí)現(xiàn)。接口不能提供抽象類(lèi)的實(shí)現(xiàn)。
- 繼承 vs 抽象:? Java 接口可以使用關(guān)鍵字“
implements”來(lái)實(shí)現(xiàn),抽象類(lèi)可以使用關(guān)鍵字“extends”進(jìn)行擴(kuò)展。 - 多重實(shí)現(xiàn): 一個(gè)接口只能擴(kuò)展另一個(gè)Java接口,一個(gè)抽象類(lèi)可以擴(kuò)展另一個(gè)Java類(lèi)并實(shí)現(xiàn)多個(gè)Java接口。
- 數(shù)據(jù)成員的可訪問(wèn)性: 默認(rèn)情況下,Java 接口的成員是公共的。Java 抽象類(lèi)可以具有私有、受保護(hù)等類(lèi)成員。
import java.io.*;
abstract class Shape {
String objectName = " ";
Shape(String name) { this.objectName = name;
}
public void moveTo(int x, int y){
System.out.println(this.objectName + " "
+ "已移至"
+ " x = " + x + " and y = " + y);
}
abstract public double area();
abstract public void draw();
}
class Rectangle extends Shape {
int length, width;
Rectangle(int length, int width, String name){
super(name);
this.length = length;
this.width = width;
}
@Override public void draw(){
System.out.println("矩形已繪制");
}
@Override public double area(){
return (double)(length * width);
}
}
class Circle extends Shape {
double pi = 3.14;
int radius;
Circle(int radius, String name){
super(name);
this.radius = radius;
}
@Override public void draw(){
System.out.println("圓形已繪制");
}
@Override public double area(){
return (double)((pi * radius * radius) / 2);
}
}
class HY {
public static void main(String[] args){
Shape rect = new Rectangle(2, 3, "Rectangle");
System.out.println("矩形面積:"
+ rect.area());
rect.moveTo(1, 2);
System.out.println(" ");
Shape circle = new Circle(2, "Circle");
System.out.println("圓的面積:"
+ circle.area());
circle.moveTo(2, 4);
}
}
輸出:
矩形面積:6.0
矩形已移至 x = 1 和 y = 2
圓的面積:6.28
圓已移至 x = 2 和 y = 4
如果我們?cè)诰匦魏蛨A形之間沒(méi)有任何通用代碼,請(qǐng)使用界面。
import java.io.*;
interface Shape {
void draw();
double area();
}
class Rectangle implements Shape {
int length, width;
Rectangle(int length, int width){
this.length = length;
this.width = width;
}
@Override public void draw(){
System.out.println("矩形已繪制");
}
@Override public double area(){
return (double)(length * width);
}
}
class Circle implements Shape {
double pi = 3.14;
int radius;
Circle(int radius) { this.radius = radius; }
@Override public void draw(){
System.out.println("圓形已繪制");
}
@Override public double area(){
return (double)((pi * radius * radius) / 2);
}
}
class HY {
public static void main(String[] args){
Shape rect = new Rectangle(2, 3);
System.out.println("矩形面積:"
+ rect.area());
Shape circle = new Circle(2);
System.out.println("圓的面積:"
+ circle.area());
}
}
輸出:
矩形面積:6.0
圓的面積:6.28
什么時(shí)候用什么?
如果以下任何陳述適用于您的情況,請(qǐng)考慮使用抽象類(lèi):??
- 在
java應(yīng)用程序中,有一些相關(guān)的類(lèi)需要共享一些代碼行,那么你可以將這些代碼行放在抽象類(lèi)中,并且這個(gè)抽象類(lèi)應(yīng)該由所有這些相關(guān)類(lèi)進(jìn)行擴(kuò)展。 - 您可以在抽象類(lèi)中定義非靜態(tài)或非最終字段,以便您可以通過(guò)方法訪問(wèn)和修改它們所屬的對(duì)象的狀態(tài)。
- 您可以期望擴(kuò)展抽象類(lèi)的類(lèi)具有許多公共方法或字段,或者需要除
public之外的訪問(wèn)修飾符(例如protected和private)。
如果以下任何陳述適用于您的情況,請(qǐng)考慮使用接口:??
- 它是一個(gè)完全的抽象,接口中聲明的所有方法都必須由實(shí)現(xiàn)此接口的類(lèi)來(lái)實(shí)現(xiàn)。
- 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。它被稱為多重繼承。
- 您想指定特定數(shù)據(jù)類(lèi)型的行為,但不關(guān)心誰(shuí)實(shí)現(xiàn)其行為。
到此這篇關(guān)于Java抽象類(lèi)和接口的區(qū)別詳情的文章就介紹到這了,更多相關(guān)Java抽象類(lèi)和接口的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Gateway組件的三種使用方式實(shí)例詳解
Spring Cloud Gateway是 Spring 官方基于 Spring5.0 、 SpringBoot2.0 和 Project Reactor 等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān)旨在為微服務(wù)框架提供一種簡(jiǎn)單而有效的統(tǒng)一的API 路由管理方式,統(tǒng)一訪問(wèn)接口,這篇文章主要介紹了Spring Cloud Gateway組件的三種使用方式,需要的朋友可以參考下2024-01-01
SpringCloud openfeign相互調(diào)用實(shí)現(xiàn)方法介紹
在springcloud中,openfeign是取代了feign作為負(fù)載均衡組件的,feign最早是netflix提供的,他是一個(gè)輕量級(jí)的支持RESTful的http服務(wù)調(diào)用框架,內(nèi)置了ribbon,而ribbon可以提供負(fù)載均衡機(jī)制,因此feign可以作為一個(gè)負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用框架使用2022-11-11
java 重定義數(shù)組的實(shí)現(xiàn)方法(與VB的ReDim相像)
java 重定義數(shù)組的實(shí)現(xiàn)方法(與VB的ReDim相像),需要的朋友可以參考一下2013-04-04
Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解
Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒(méi)有可以直接操作內(nèi)存的工具類(lèi)呢?有!Java中提供Unsafe類(lèi)可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類(lèi),需要的朋友可以參考下2021-06-06
Spring AI 入門(mén)學(xué)習(xí)指南
本文介紹了如何使用SpringAI和Ollama進(jìn)行AI開(kāi)發(fā),包括如何配置和使用聊天、圖像、語(yǔ)音轉(zhuǎn)文字和文字轉(zhuǎn)語(yǔ)音模型,以及如何在Java項(xiàng)目中集成Ollama模型,感興趣的朋友一起看看吧2024-11-11
Shiro安全框架的主要組件及認(rèn)證過(guò)程簡(jiǎn)介
這篇文章主要介紹了Shiro安全框架的主要組件及認(rèn)證過(guò)程簡(jiǎn)介,Shiro?是一個(gè)強(qiáng)大靈活的開(kāi)源安全框架,可以完全處理身份驗(yàn)證、授權(quán)、加密和會(huì)話管理,本文就來(lái)介紹一下此框架的核心組成,需要的朋友可以參考下2023-08-08
LibrarySystem圖書(shū)管理系統(tǒng)開(kāi)發(fā)(一)
這篇文章主要為大家詳細(xì)介紹了LibrarySystem圖書(shū)管理系統(tǒng)開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Spring Cloud超詳細(xì)i講解Feign自定義配置與使用
這篇文章主要介紹了SpringCloud Feign自定義配置與使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
IntelliJ IDEA 2021.1 EAP 4 發(fā)布:字體粗細(xì)可調(diào)整Git commit template 支持
這篇文章主要介紹了IntelliJ IDEA 2021.1 EAP 4 發(fā)布:字體粗細(xì)可調(diào)整,Git commit template 支持,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

