1.静态类
1.1静态类的定义:
定义格式
下面是一个示例,展示了如何定义这样一个“静态类”:
public final class StaticUtilClass {// 私有构造器,防止外部实例化private StaticUtilClass() {throw new AssertionError("No StaticUtilClass instances for you!");}// 静态方法示例public static int add(int a, int b) {return a + b;}// 静态变量示例public static final String GREETING = "Hello, World!"; }
解释
- 私有构造器:通过将构造器声明为私有(private),可以防止从类的外部创建其实例。如果你希望在构造器中抛出异常以强调不应该实例化此类,可以像上面那样做。
- 静态方法:所有的业务逻辑方法都是静态的,可以直接通过类名调用。
- 静态变量:所有的常量或共享变量也是静态的。
使用示例
public class Main {public static void main(String[] args) {// 使用静态方法int result = StaticUtilClass.add(5, 3);System.out.println(result); // 输出 8// 访问静态变量System.out.println(StaticUtilClass.GREETING); // 输出 Hello, World!} }
在这个例子中,
StaticUtilClass
只包含静态方法和静态变量,并且不能实例化。这种模式非常适用于工具类或实用程序类,这些类通常用于提供一些通用功能,而不需要创建实例。注意事项
- 不可实例化:由于构造器是私有的,所以这个类实际上不能被实例化。
- 线程安全:静态方法和静态变量是类级别的,所以在多线程环境中访问时要特别注意线程安全问题。
- 设计模式:这种类的设计模式通常被称为“工具类”或“单例模式”的变体,尽管它不是传统意义上的单例。
通过这种方式定义的类,可以有效地作为一组静态方法和常量的集合,方便在应用程序中使用。
2.抽象类
2.1抽象类的定义:
抽象类(Abstract Class)是 Java 中一种特殊的类,它可以包含抽象方法(abstract methods),也可以包含具体实现的方法和变量。抽象类不能被实例化,即不能直接创建抽象类的对象,但可以用来声明引用变量,指向其具体子类的实例。
2.2抽象类的定义格式:
抽象类的定义通常包含以下几个部分:
- 抽象类声明:使用
abstract
关键字声明一个类为抽象类。- 抽象方法:使用
abstract
关键字声明的方法称为抽象方法,这类方法只有声明而没有实现(即没有方法体)。- 具体方法:除了抽象方法外,还可以包含具体实现的方法。
- 构造器:尽管抽象类本身不能被实例化,但仍然可以拥有构造器,主要用于子类的初始化过程。
- 成员变量:可以包含实例变量和静态变量。
2.3抽象类的示例代码
下面是一个抽象类的定义示例:
public abstract class Animal {private String name;// 构造器public Animal(String name) {this.name = name;}// 抽象方法public abstract void makeSound();// 具体方法public void eat() {System.out.println(name + " is eating.");}// getter 和 setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;} }
使用抽象类
要使用抽象类,必须通过继承的方式创建一个子类,并且子类必须实现父类中的所有抽象方法。以下是
Animal
类的一个具体子类的实现:public class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void makeSound() {System.out.println(getName() + " says Woof!");} }public class Cat extends Animal {public Cat(String name) {super(name);}@Overridepublic void makeSound() {System.out.println(getName() + " says Meow!");} }
主方法
下面是一个主方法示例,演示如何使用这些类:
public class Main {public static void main(String[] args) {Animal dog = new Dog("Buddy");Animal cat = new Cat("Whiskers");dog.makeSound(); // 输出 Buddy says Woof!dog.eat(); // 输出 Buddy is eating.cat.makeSound(); // 输出 Whiskers says Meow!cat.eat(); // 输出 Whiskers is eating.} }
2.4抽象类的注意事项
- 抽象类不能被实例化:不能直接创建抽象类的对象,但可以声明抽象类类型的引用变量。
- 子类必须实现抽象方法:如果子类继承了抽象类,那么它必须实现抽象类中的所有抽象方法,除非子类本身也被声明为抽象类。
- 抽象方法没有方法体:抽象方法只有方法签名,没有具体实现(即没有大括号
{}
内部的代码)。通过抽象类和抽象方法,可以定义一组规范,让子类遵循这些规范并提供具体的实现,从而达到代码的重用和良好的设计目的。
3.关于静态类和抽象类的一些问题:
3.1为什么静态的成员变量不需要创建对象就能使用?
静态成员变量之所以不需要创建对象就能使用,是因为它们属于类本身,而不是类的实例。静态成员变量在类加载时初始化,并且在整个类的所有实例之间共享。因此,可以通过类名直接访问静态成员变量,而无需创建类的实例。
3.2为什么静态的方法中不能使用普通的成员变量和成员方法?
静态方法由于其特殊性质——与类的实例无关,因此不能直接访问普通成员变量和成员方法。如果需要在静态方法中使用这些非静态成员,可以通过创建对象实例的方式进行访问。这样既保持了静态方法的特性,又实现了对普通成员变量和成员方法的访问。
3.3请描述静态代码块的特点?
- 仅执行一次:静态代码块在类被加载时仅执行一次,无论创建多少个类的实例。
- 优先于构造方法执行:静态代码块在任何构造方法之前执行。
- 与类绑定:静态代码块与类绑定,而不是与类的实例绑定。
- 可用于初始化静态成员变量:静态代码块常用于初始化静态成员变量。
- 按定义顺序执行:多个静态代码块按定义顺序依次执行。
- 多线程安全:静态代码块的执行是线程安全的,JVM 会确保静态代码块正确执行。
3.4请说明什么是方法重写, 以及什么时候需要方法重写?
方法重写指的是子类中定义了一个与父类中已有的方法完全相同的方法签名(方法名、参数列表、返回类型)。
方法重写通常在以下情况下使用:
实现特定的行为:当子类需要对继承自父类的方法进行特定的实现时,就需要重写该方法。这是因为父类提供的默认实现可能不符合子类的需求。
增加额外的功能:子类可能需要在其继承的方法基础上增加额外的功能,这时也需要重写该方法。
改变方法的行为:当子类希望改变父类方法的行为,比如算法实现或业务逻辑时,就需要重写该方法。
实现抽象方法:如果父类是一个抽象类,并且其中包含抽象方法(没有具体实现的方法),那么子类必须重写这些抽象方法以提供具体的实现。
多态性:为了实现多态性,即通过父类的引用来调用子类的方法,需要重写父类的方法。这样,即使使用的是父类的引用,实际执行的是子类的方法。
3.5请描述抽象方法的特点
- 不可实例化:抽象方法存在于抽象类中,而抽象类不能被实例化。这意味着我们不能直接创建一个抽象类的对象。
2.无方法体:抽象方法没有具体实现(即没有方法体),它只声明了方法的签名(包括返回类型、方法名和参数列表)。
3.强制实现:在继承抽象类的子类中,必须实现父类的所有抽象方法,除非子类本身也被声明为抽象类。
4.多态性:通过抽象方法可以实现多态性,子类可以重写抽象方法以提供不同的实现逻辑,这有助于提高代码的可扩展性和复用性。
3.6请描述抽象类的特点
- 抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。
- 类有的成员:成员变量、方法、构造器,抽象类都可以有。
- 抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
- 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。