一种不能被实例化的类,目的是为了让其他类继承它,并在子类中完善它的抽象方法。我们使用 abstract
关键字来定义抽象类,同时它可以包含抽象方法和普通方法。
例子:
abstract class Shape {
// 抽象方法,没有实现
abstract void draw();
// 普通方法,有具体实现
void display() {
System.out.println("This is a shape.");
}
}
在这个例子中,Shape
是一个抽象类,它包含了一个抽象方法 draw
和一个普通方法 display
。抽象方法没有实际的实现,而是在子类中被具体实现。
当我们要创建一个实际的形状类时,我们可以继承抽象类并实现它的抽象方法,比如:
class Circle extends Shape {
void draw() {
System.out.println("Drawing a circle.");
}
}
接口定义了一组方法,但没有提供这些方法的具体实现。类通过实现(implements)接口来承诺提供这些方法的具体实现。让我们看一个简单的例子:
// 定义一个简单的接口
interface Eater {
void eat();
}
// 实现接口的类
class Human implements Eater {
public void eat() {
System.out.println("Human is eating.");
}
}
// 另一个实现接口的类
class Animal implements Eater {
public void eat() {
System.out.println("Animal is eating.");
}
}
在这个例子中,Eater
是一个接口,它规定了一个方法 eat
。然后,Human
和 Animal
这两个类分别实现了这个接口,提供了各自的 eat
方法的具体实现。
在Java接口中,所有的成员都具有公共的访问权限。接口中的字段(成员变量)默认为 public
、static
、final
,而方法默认为 public
和 abstract
。
非 public 的数据没有用,不能被任何调用。(不写修饰符编译器也会默认为Public)
在 Java 中,与 C++ 不同,没有类似于 C++ 中的 "友元" 的概念
注意:
类只能继承一个类,但可以实现多个接口。
抽象类可以有构造器,而接口不能有。
抽象类中的抽象方法可以有具体的实现,而接口中的方法默认是抽象的,不能有实现。
final 和 static 的区别:
`final` 关键字:
1. **变量:** 当应用于变量时,`final` 表示该变量是一个常量,不可再被修改。一旦被赋值,就不能再改变。
```java
final int MAX_VALUE = 100;
```2. **方法:** 当应用于方法时,`final` 表示该方法不能被子类重写。
```java
class Parent {
final void display() {
System.out.println("This is a final method.");
}
}class Child extends Parent {
// 无法重写display方法
}
```3. **类:** 当应用于类时,`final` 表示该类不能被继承。
```java
final class FinalClass {
// 不能有子类
}
````static` 关键字:
1. **变量:** 当应用于变量时,`static` 表示该变量属于类而不是实例。所有实例共享同一份变量。
```java
class Example {
static int count = 0;
}
```2. **方法:** 当应用于方法时,`static` 表示该方法属于类而不是实例。可以通过类名直接调用,不需要创建实例。
```java
class Utility {
static void doSomething() {
System.out.println("This is a static method.");
}
```3. **块:** 当应用于块时,`static` 表示该块在类加载时执行,而不是在实例创建时执行。
```java
class Example {
static {
System.out.println("This is a static block.");
}
}
```
对于静态变量(静态字段),可以通过类名直接访问并修改它们,但是静态方法不能重写。
没有静态类这个东西。