Java中的Type接口和Class类区别和联系

 

 

 

 

Java中的Type接口和Class类有什么区别


Type是Class的父接口。

Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。

 

这里举个当Type是参数化类型的例子:

public class B<T,K> {
}
 
 
package test;
 
public class Book extends B<String,Integer>{
}
 
 
import test.B;
import test.Book;
import java.lang.reflect.Type;
 
public class Main {
    public static void main(String[] args) {
        Book book=new Book();
        Class cbook=book.getClass();
        //获取Book类的直接超类的Type
        Type type=cbook.getGenericSuperclass();
        Class cb=new B().getClass();
 
        System.out.println(type);
        System.out.println(cb);
 
    }
}


运行结果:

test.B<java.lang.String, java.lang.Integer>
class test.B


可以看出,Type可以表示出泛型的类型,而Class不能。

 

 另外,如果想要获取泛型类型的数组,可以将Type转化为它的子接口ParameterizedType,通过getActualTypeArguments() 获取:

Type[] paramList=((ParameterizedType)type).getActualTypeArguments();
System.out.println(paramList[0]+"  "+paramList[1]);


运行结果:

class java.lang.String  class java.lang.Integer

 

 

Java中的Type接口和Class类有什么区别_零怀念的博客-CSDN博客_java class type
https://blog.csdn.net/linghuainian/article/details/86137810

 

 

 

 

 

==========================================================================================

==========================================================================================

==========================================================================================

 

 

 

 

 

Type定义与说明

源代码:

package java.lang.reflect;

/**
 * Type is the common superinterface for all types in the Java
 * programming language. These include raw types, parameterized types,
 * array types, type variables and primitive types.
 *
 * @since 1.5
 */
public interface Type {
    /**
     * Returns a string describing this type, including information
     * about any type parameters.
     *
     * @implSpec The default implementation calls {@code toString}.
     *
     * @return a string describing this type
     * @since 1.8
     */
    default String getTypeName() {
        return toString();
    }
}


总结来说:

Type是一个接口。
Type是Java中所有类型的父接口。
Type包括:raw type(原始类型,对应Class), parameterized types(参数化类型),  array types(数组类型),  type variables(类型变量) and   primitive types(基本类型,对应Class).
Type是JDK1.5引入的,主要是为了泛型。

 


Class定义与说明

源代码:

/**
 * Instances of the class {@code Class} represent classes and
 * interfaces in a running Java application.  An enum is a kind of
 * class and an annotation is a kind of interface.  Every array also
 * belongs to a class that is reflected as a {@code Class} object
 * that is shared by all arrays with the same element type and number
 * of dimensions.  The primitive Java types ({@code boolean},
 * {@code byte}, {@code char}, {@code short},
 * {@code int}, {@code long}, {@code float}, and
 * {@code double}), and the keyword {@code void} are also
 * represented as {@code Class} objects.
 *
 * <p> {@code Class} has no public constructor. Instead {@code Class}
 * objects are constructed automatically by the Java Virtual Machine as classes
 * are loaded and by calls to the {@code defineClass} method in the class
 * loader.
 *
 * <p> The following example uses a {@code Class} object to print the
 * class name of an object:
 *
 * <blockquote><pre>
 *     void printClassName(Object obj) {
 *         System.out.println("The class of " + obj +
 *                            " is " + obj.getClass().getName());
 *     }
 * </pre></blockquote>
 *
 * <p> It is also possible to get the {@code Class} object for a named
 * type (or for void) using a class literal.  See Section 15.8.2 of
 * <cite>The Java&trade; Language Specification</cite>.
 * For example:
 *
 * <blockquote>
 *     {@code System.out.println("The name of class Foo is: "+Foo.class.getName());}
 * </blockquote>
 *
 * @param <T> the type of the class modeled by this {@code Class}
 * object.  For example, the type of {@code String.class} is {@code
 * Class<String>}.  Use {@code Class<?>} if the class being modeled is
 * unknown.
 *
 * @author  unascribed
 * @see     java.lang.ClassLoader#defineClass(byte[], int, int)
 * @since   JDK1.0
 */
public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration,
                              Type,
                              AnnotatedElement {
}

 

总结来说:Class是一个类。
Class对象代表着正在运行的Java程序中的类型和接口:enum、annotation、array以及基本类型(8种)都可以用Class对象表示。
Class没有public构造器。

当类被加载或者在class loader中被方法调用时,JVM会自动构造Class对象。

 

Type接口与Class类的区别联系

Type是Class的父接口。
Class是Type的子类。

 

 

Java中Type接口与Class类的区别联系_韩超的博客 (hanchao5272)-CSDN博客_java type class
https://blog.csdn.net/hanchao5272/article/details/79401434

 

<think>好的,用户现在想了解Java 8之后抽象接口区别。我之前帮他解答过关于字符串常量池的问题,现在需要处理另一个Java语法相关的问题。首先,我需要确认用户的基础,可能他正在学习Java面向对象的概念,或者在项目中遇到了设计上的困惑。 首先,我得回忆Java 8对接口的改动,特别是默认方法静态方法的引入。这点很重要,因为之前的版本中接口只能有抽象方法,而Java 8允许接口有方法实现,这缩小了抽象接口之间的差异,但两者还是有区别的。 接下来,我需要整理两者的主要区别。可能包括以下几个方面:方法实现的能力、成员变量、构造器、继承方式、设计目的等。同时,用户可能关心在什么情况下应该使用抽象,什么情况下用接口。 要注意用户可能对默认方法不太熟悉,需要解释清楚。比如,接口的默认方法是为了向后兼容,允许添加新方法而不破坏现有实现。而抽象可以有构造器,可以包含状态,这些是接口不能的。 另外,Java 8之后接口可以有静态方法,但抽象也可以有静态方法,这点可能需要强调两者的静态方法在用法上的区别?或者是否接口的静态方法只能是public的? 还要考虑多继承的问题,因为Java只能单继承,但接口可以多实现。这点在设计中很重要,用户可能需要知道如何选择。比如,如果需要多继承行为,接口是更好的选择。 用户可能还关心实际应用中的例子,比如什么时候用抽象,什么时候用接口。比如,抽象适合提供通用功能的模板,而接口适合定义行为契约。 需要检查是否有遗漏的区别点,比如成员变量的修饰符(接口默认public static final,抽象可以是任意),构造器的存在与否,以及单继承与多继承的限制。 另外,Java 9的私有方法是否在考虑范围内?不过用户问的是Java 8之后,可能包括Java 9的特性,但可能主要关注Java 8的变化。需要明确说明版本差异,比如从Java 8开始接口可以有默认静态方法,Java 9又允许私有方法。 最后,总结两者的区别,给出使用场景的建议,帮助用户在实际开发中做出选择。需要确保语言通俗易懂,结构清晰,分点说明,对比表格可能会有帮助。</think>--- ### **Java 8 后抽象接口区别** Java 8 引入了接口的**默认方法(Default Methods)****静态方法(Static Methods)**,使得接口与抽象的功能部分重叠,但二者仍有本质差异。以下是主要区别及适用场景: --- ### **1. 核心区别对比表** | **特性** | **抽象** | **接口Java 8+)** | |------------------------|-------------------------------|--------------------------------| | **方法实现** | 可包含具体方法(有方法体) | 默认方法(`default`)静态方法(`static`)可包含方法体 | | **成员变量** | 可定义普通变量(非 final) | 变量默认为 `public static final`(常量) | | **构造方法** | 可以有构造方法 | **无构造方法** | | **继承机制** | **单继承**(一个只能继承一个抽象) | **多实现**(一个可实现多个接口) | | **设计目的** | 表示 **"is-a" 关系**(通用模板)| 表示 **"can-do" 关系**(行为契约) | | **访问修饰符** | 方法/变量可以是任意访问修饰符 | 默认 `public`,不可用 `private`(Java 9 后允许接口私有方法) | --- ### **2. 具体差异解析** #### **(1) 方法实现能力** - **抽象**: 可以包含**抽象方法****具体方法**。 ```java public abstract class Animal { // 抽象方法 public abstract void eat(); // 具体方法 public void breathe() { System.out.println("Breathing..."); } } ``` - **接口**: - **默认方法**:通过 `default` 关键字定义,提供默认实现。 - **静态方法**:通过 `static` 关键字定义,直接通过接口名调用。 ```java public interface Swimmable { // 抽象方法 void swim(); // 默认方法 default void dive() { System.out.println("Diving..."); } // 静态方法 static void showSpeed() { System.out.println("Speed: 10 km/h"); } } ``` #### **(2) 成员变量** - **抽象**: 可以定义**普通成员变量**(可修改)**静态变量**。 ```java public abstract class Vehicle { protected int speed; // 普通变量(非 final) public static final String TYPE = "Vehicle"; // 静态常量 } ``` - **接口**: 所有变量**默认是 `public static final`**(常量)。 ```java public interface Flyable { int MAX_HEIGHT = 10000; // 等同于 public static final int MAX_HEIGHT = 10000; } ``` #### **(3) 构造方法** - **抽象**: 可以有构造方法(用于初始化成员变量或执行通用逻辑)。 ```java public abstract class Shape { private String color; public Shape(String color) { this.color = color; } } ``` - **接口**: **无构造方法**,因为接口不保存对象状态(无实例变量需要初始化)。 --- ### **3. 设计哲学与使用场景** #### **抽象的适用场景** - 需要定义**通用模板**,包含部分具体实现(如工具)。 - 需要**共享成员变量或非 final 字段**。 - 需要**单继承关系**(如 `Animal` -> `Dog`)。 #### **接口的适用场景** - 定义**行为契约**(如 `Runnable`、`Comparable`)。 - 需要**多继承行为**(一个实现多个接口)。 - 需要**向后兼容**(通过默认方法扩展接口功能而不破坏现有实现)。 --- ### **4. Java 8+ 的兼容性改进** - **默认方法**: 允许接口在不强制子实现的情况下扩展功能。 ```java public interface Loggable { default void log(String message) { System.out.println("Log: " + message); } } ``` - **静态方法**: 提供接口级别的工具方法(如 `Comparator.comparing()`)。 ```java public interface MathUtils { static int add(int a, int b) { return a + b; } } ``` --- ### **5. 总结** | **维度** | **抽象** | **接口** | |----------------|------------------------------|------------------------------| | **核心目的** | 定义通用基(共享代码) | 定义行为规范(多态扩展) | | **状态管理** | 可保存对象状态(成员变量) | 无状态(仅常量) | | **继承机制** | 单继承 | 多实现 | | **典型使用** | `AbstractList`, `HttpServlet`| `Runnable`, `Serializable` | **优先选择接口**: - 需要多继承、定义轻量级契约、或未来可能扩展功能时。 **优先选择抽象**: - 需要共享代码、控制子构造逻辑、或管理对象状态时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值