本文讨论抽象类和最终类的区别。在讨论差异之前,让我们首先了解它们各自的含义。
最终类:使用“Final”关键字声明的类称为最终类。 Final关键字用于最终确定该类中使用的类、方法和变量的实现。使用最终类的主要目的是防止该类被继承(即,如果一个类被标记为最终类,则任何其他类都不能从该最终类继承任何属性或方法。如果最终类被扩展,Java 会给出编译时错误。以下是如何声明最终类的示例。但是,由于要继承此最终类,因此会出现编译时错误。
Java
// Java program to demonstrate the
// Final class
final class Super {
private int data = 100;
}
public class Sub extends Super {
public static void main(String args[])
{
}
}
抽象类:使用 “abstract” 关键字声明的类称为抽象类。抽象类背后的主要思想是实现以下概念抽象。抽象类可以同时具有抽象方法(没有主体的方法)和具体方法(有主体的常规方法)。但是,普通类(非抽象类)不能有抽象方法。以下是如何声明抽象类的示例。
Java
// Java program to demonstrate
// an abstract class
// Abstract parent class
abstract class Book {
// Abstract method without body
public abstract void page();
}
// shayar class extends Book class
public class shayar extends Book {
// Declaring the abstract method
public void page()
{
System.out.println("Geek");
}
// Driver code
public static void main(String args[])
{
Book obj = new shayar();
obj.page();
}
}
上面的程序给出“Geek”作为输出。所有抽象方法都应该在子类中重写以提供实现。然而,从定义来看,final 方法不能被重写。因此,抽象的最终组合对于方法来说是非法的。而且,对于抽象类,我们需要创建一个子类来提供实现,而对于最终类,我们不能创建子类。因此,最终的抽象组合对于类来说是非法的。因此,最终类不能包含抽象方法,而抽象类可以包含最终方法。下面是一个示例,演示了抽象类和最终类的组合。
Java
final class A {
public abstract void methodOne();
}
显然,这个实现是无效的,因为最终类不能有抽象方法。作为final类不能被继承。
Java
abstract class A {
public final void methodOne() {}
}
但是,抽象类可以有最终方法。这个最终方法被视为具有无法重写的主体的普通方法。
下表展示了抽象类和最终类之间的区别:
编号 | 抽象类 | 最后一堂课 |
---|---|---|
1. | 使用“abstract”关键字。 | 使用“final”关键字。 |
2. | 这有助于实现抽象。 | 这有助于限制其他类访问其属性和方法。 |
3. | 为了以后使用,应该重写所有抽象方法 | 由于最终类不能被继承,因此不会出现重写概念 |
4. | 有的方法可以实现,有的不能实现 | 所有方法都应该有实现 |
5. | 无法创建不可变对象(事实上,无法创建任何对象) | 可以创建不可变对象(例如 String 类) |
6. | 抽象类方法的函数可以在子类中更改 | Final 类方法应该像其他类一样使用 |
7. | 可以继承 | 不可继承 |
8. | 无法实例化 | 可以实例化 |
9. | 抽象类可能有最终方法。 | Final类没有抽象方法或final方法。 |
10. | 抽象类有助于实现抽象。 | Final 类可以帮助限制其他类访问属性和方法。 |
相关用法
- Java FileDescriptor sync()用法及代码示例
- Java FileDescriptor valid()用法及代码示例
- Java FileInputStream available()用法及代码示例
- Java FileInputStream close()用法及代码示例
- Java FileInputStream finalize()用法及代码示例
- Java FileInputStream getChannel()用法及代码示例
- Java FileInputStream getFD()用法及代码示例
- Java FileInputStream skip()用法及代码示例
- Java FileOutputStream close()用法及代码示例
- Java FileOutputStream finalize()用法及代码示例
- Java FileOutputStream getChannel()用法及代码示例
- Java FileOutputStream getFD()用法及代码示例
- Java FilePermission equals()用法及代码示例
- Java FilePermission getActions()用法及代码示例
- Java FilePermission hashCode()用法及代码示例
- Java FilePermission implies()用法及代码示例
- Java FilePermission newPermissionCollection()用法及代码示例
- Java FilterInputStream available()用法及代码示例
- Java FilterInputStream close()用法及代码示例
- Java FilterInputStream mark()用法及代码示例
- Java FilterInputStream markSupported()用法及代码示例
- Java FilterInputStream reset()用法及代码示例
- Java FilterInputStream skip()用法及代码示例
- Java FilterOutputStream close()用法及代码示例
- Java FilterOutputStream flush()用法及代码示例
注:本文由纯净天空筛选整理自gauravmoney26大神的英文原创作品 Difference between Final and Abstract in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。