静态变量和实例变量的区别
区别 | 实例成员 | 类成员 |
---|---|---|
定义方式不同 | 不使用static修饰的变量是实例成员 | 使用static修饰的变量称为类变量,其本质上是一个全局变量 |
生命周期不同 | 实例成员随着对象的创建而分配内存,随着对象的销毁而释放内存 | 类成员随着类的加载而分配内存,随着类消失而释放内存。 |
数据存储位置不同 | 实例成员存储在堆内存中 | 类成员存储在方法区中(共享数据区) |
调用方式不同 | 实例成员只能被对象调用 | 类成员可以被对象调用,还可以被类名调用 |
别名不同 | 类成员也称为静态成员 | |
初始化时机不同 | 实例化对象时初始化 | 类首次加载时初始化,优先于实例成员初始化 |
使用方式不同 | 每一个对象都拥有自己的实例成员 | 所有的对象共享一个类成员 |
调用规则不同 | 实例方法内可以调用实例成员(实例变量、实例方法)和类成员(类变量、类方法)。 | 类方法只能调用类方法,不能直接调用实例成员(实例变量、实例方法)。如果在类方法想调用实例成员必须创建对象,用对象去调用实例成员。 |
this和super的使用 | 在实例方法内可以使用this和super关键字。 | 在类方法内不能使用this,super关键字。 |
抽象类和接口的异同
区别 | 抽象类 | 接口 |
---|---|---|
多继承 | 子类只能继承一个直接抽象类 | 子类可以实现多个接口 |
实现 | 子类使用extends继承抽象类 | 子类通过implements实现接口 |
成员 | 1.抽象类中可以有实例成员(实例变量、实例方法) 2.静态成员(静态变量、静态方法) 3.抽象方法 4.内部类 5.抽象类中的成员方法没有default关键字修符。 | 接口中只能有 1. 常量 2. 抽象方法 3. 有实现体的静态方法 4. 用default关键字修饰符的实现体方法 5. 内部类 |
成员变量修饰符 | 抽象类中可定义变量,也可定义常量 | 接口中只能定义常量(public static final修饰的变量) |
子类实现 | 子类在实现抽象方法时不允许缩小访问权限 | 子类在实现抽象方法时必须指定public权限 |
构造函数 | 抽象类可以有构造函数 | 接口中不能定义构造函数 |
最高层 | 类的最高层是Object | 接口没有最高层 |
相同点 | 两者都不能实例化 都可以包含抽象方法 |
==和equals 的区别
-
equals是判断两个变量或者实例指向同一个内存空间的值是不是相同
-
== 若是基本数据类型,则直接比较其存储的 “值”是否相等; 若是引用类型,则比较的是所指向的对象的地址