抽象类的特点:
- 不能实例化对象;
- 类中可以定义抽象方法(abstract修饰的方法);
- 抽象类中可以没有抽象方法。
- abstract修饰的方法称为抽象方法,抽象方法只有方法的声明没有方法实现,即没有方法体。包含抽象方法的类本身必须被声明为抽象的。
abstract class Animal {
private String color ;2
public abstract void shout();
}
abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。下面是抽象方法声明时采用的语法:
abstract void f();
抽象类的继承
派生类继承抽象类必须实现(重写)抽象类中所有的抽象方法,否则派生类也必须定义为抽象类。(重写所有方法)
抽象类不能实例化对象
接口
- Java中的接口是一系列方法的声明,是一些方法特征的集合,接口可以看做是一种特殊的抽象类,其中包含常量和方法的声明,而没有变量和方法的实现。
- 接口的定义语法://interface取代class
- interface 接口名称 {
//接口中的常量声明
//接口中的抽象方法声明
//接口类只能包含普通方法,接口类是一种特殊的抽象类
}
举例:
interface Comparable {
int compareTo(Object other);
}
每个类只能拥有一个超类(父类),但却可以实现多个接口
接口中的方法默认是public类型的,即便不写权限修饰符。在其实现类中,不能降低权限。
接口中的属性都是常量,即便不写关键词final。
Serialiable 空接口 可扩展性
接口的实现
类可以通过实现接口的方式来具有接口中定义的功能,基本语法:
class 类名 implements 接口名 {
……
}
一个类可以同时实现多个接口;
一个接口可以被多个无关的类实现;
一个类实现接口必须实现接口中所有的抽象方法,否则必须定义为抽象类。
class Employee implements Comparable {
public int compareTo(Object other) {
}
}
接口的继承
Java中接口可以继承接口,与类的继承概念一致,一个接口继承一个父接口就会继承父接口中定义的所有方法和属性。
Java中接口的继承是多继承机制,即一个接口可以同时继承多个接口。
接口继承的基本语法 :
interface 接口名 extends 父接口1,父接口2,……{
……
}
意义
- 弥补Java中单继承机制的不足。
//java只有单继承,弥补不足 - 接口只有方法的定义没有方法的实现,即都是抽象方法,这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
JDK8及以后,允许在接口中定义static方法和default方法。
public interface JDK8Interface {
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法");
}
}
总结
抽象类不能实例化,但是可以声明抽象类的引用
不包含抽象方法的类不一定不是抽象类(抽象类中可以不含抽象方法)
抽象方法不含方法体,必须显式定义为abstract(不同于void display(){ })
抽象类的派生类必须实现基类的所有抽象方法,否则也必须定义为抽象类
接口
弥补Java单一继承的不足
不能实例化,但是可以声明接口变量
包含常量和方法的声明,不含变量和方法的实现(常量可以没有final修饰,必须初始化,在接口实现类中不能修改值;方法可以没有abstract,在接口实现类中必须实现;static方法和default方法可以有方法体)
接口中的抽象方法不能有方法体(即便是空的方法体{ }也不行)
接口不能继承类
接口可以继承(extends)1个或多个接口(,分隔开)
一个类可以实现(implements)1个或多个接口(,分隔开)
Object
- Object类有一个默认构造方法 pubilc Object(),在构造派生类实例时,都会先调用这个默认构造方法。
- 在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
- 可以使用类型为Object的变量指向任意类型的对象。
- Object类的变量只能用作各种值的通用持有者。要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。
- 例如:
Object obj = new MyObject();
MyObject x = (MyObject) obj;
-
Object() 是默认构造方法。
-
clone() 创建并返回此对象的一个副本。
-
equals(Object obj)
指示某个其他对象是否与此对象“相等”。 -
finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 -
getClass() 返回一个对象的运行时类。
-
hashCode() 返回该对象的哈希码值。
-
notify() 唤醒在此对象监视器上等待的单个线程。
-
notifyAll()唤醒在此对象监视器上等待的所有线程。
-
toString() 返回该对象的字符串表示。
-
wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
-
wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll()方法,或者超过指定的时间量。
-
wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
**
equals()方法:
**用于测试某个对象是否同另一个对象相等。它在Object类中的实现是判断两个对象是否指向同一块内存区域。
这种测试用处不大,因为即使内容相同的对象,内存区域也是不同的。如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。
Java语言规范要求equals方法具有下面的特点:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
hashCode
- public int hashCode() 返回该对象的哈希码值。
- hashCode 的常规协定是:
– 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。
– 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
toString
- public String toString() 返回该对象的字符串表示。
- 通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。建议所有派生类都重写此方法。
- Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
- 该方法返回一个字符串,它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())