Java

Java 知识量:11 - 45 - 220

3.5 特殊的类><

java类的分类- 3.5.1 -

在Java中,类的种类可以根据不同的标准进行分类。以下是一些常见的分类方式:

1、根据类的访问修饰符分类:

  • 公开类(Public Class):可以被任何其他类访问。

  • 保护类(Protected Class):可以被同一个包中的类以及其他包中的子类访问。

  • 默认类(Default Class):只能被同一个包中的类访问。

  • 私有类(Private Class):只能被声明该类的类访问。

2、根据类的成员变量分类:

  • 静态类(Static Class):只能包含静态成员变量和静态方法,不能实例化。

  • 抽象类(Abstract Class):可以包含成员变量、方法和抽象方法,不能被实例化,可以用作基类。

  • 最终类(Final Class):不能被继承,可以包含成员变量、方法和最终方法。

  • 密封类(Sealed Class):在Java 17中引入,可以被用作密封类的基类,其子类必须在与密封类相同的模块中声明。

3、根据类的用途分类:

  • 工具类(Utility Class):包含一组静态方法的类,用于执行某些特定任务。

  • 实体类(Entity Class):用于表示现实世界中的实体,通常包含属性和行为。

  • 数据访问对象(DAO Class):用于与数据库进行交互的类,通常包含CRUD(创建、读取、更新和删除)操作的方法。

  • 服务类(Service Class):用于封装业务逻辑的类,通常包含实现业务功能的方法。

  • 控制器类(Controller Class):用于处理用户请求的类,通常包含处理HTTP请求的方法。

4、根据类的继承关系分类:

  • 基类(Base Class):被其他类继承的类。

  • 子类(Subclass):继承基类的类。

  • 接口(Interface):定义一组方法的契约,可以被类实现。

5、根据类的实例化分类:

  • 单例类(Singleton Class):只能被实例化一次的类,常用于管理全局资源。

  • 原型类(Prototype Class):可以通过克隆自身来创建新对象的类。

6、根据类的线程安全性分类:

  • 线程安全类(Thread-Safe Class):可以在多线程环境下安全使用的类。

  • 线程不安全类(Thread-Unsafe Class):需要在多线程环境下进行同步处理的类。

抽象类和方法- 3.5.2 -

在Java中,抽象类是一种不能实例化的类,通常用作其他类的基类。抽象类可以包含抽象方法和非抽象方法。

抽象方法是一种只有声明没有实现的方法。抽象方法的声明以分号结尾,没有方法体。抽象方法的声明通常在抽象类中。

以下是一个简单的Java抽象类和抽象方法的例子:

public abstract class Animal {  
    public abstract void makeSound();  
    public void eat(){  
        System.out.println("The animal eats");  
    }  
}

在这个例子中,Animal是一个抽象类,它有一个抽象方法makeSound()和一个非抽象方法eat()。

当创建Animal的子类时,必须提供makeSound()方法的实现。例如:

public class Dog extends Animal {  
    public void makeSound() {  
        System.out.println("The dog barks");  
    }  
}

在这个例子中,Dog是Animal的子类,它提供了makeSound()方法的实现。

引用类型转换- 3.5.3 -

引用类型转换(reference type conversion)是指将一个对象从一种类型转换为另一种类型。Java中的引用类型转换主要包括向上转型(upcasting)和向下转型(downcasting)。

1、向上转型(Upcasting):将子类的对象转型为父类类型,这是在Java中完全安全的。例如:

class Animal {  
  void eat() {  
    System.out.println("Animal eats");  
  }  
}  
  
class Dog extends Animal {  
  void bark() {  
    System.out.println("Dog barks");  
  }  
}  
  
public class Main {  
  public static void main(String[] args) {  
    Dog d = new Dog();  
    Animal a = d; // Upcasting  
    a.eat();  
  }  
}

在这个例子中,Dog是Animal的子类,所以可以将Dog对象向上转型为Animal对象。在执行a.eat()时,实际执行的是Dog类的eat()方法。

2、向下转型(Downcasting):将父类类型的对象转为子类类型,这可能会引发ClassCastException。例如:

class Animal {  
  void eat() {  
    System.out.println("Animal eats");  
  }  
}  
  
class Dog extends Animal {  
  void bark() {  
    System.out.println("Dog barks");  
  }  
}  
  
public class Main {  
  public static void main(String[] args) {  
    Animal a = new Animal();  
    Dog d = (Dog) a; // Downcasting  
    d.bark();  
  }  
}

在这个例子中,尝试将Animal对象向下转型为Dog对象,并调用bark()方法。但是,由于a实际上是一个Animal对象,不是Dog对象,所以会在运行时抛出ClassCastException。

在进行向下转型时,最好使用instanceof操作符来检查对象是否确实是所需的类型,以避免ClassCastException。例如:

if (a instanceof Dog) {  
  Dog d = (Dog) a;  
  d.bark();  
} else {  
  System.out.println("a is not a Dog");  
}