第六章-抽象类与接口

▼魔方 西西 提交于 2019-12-02 11:10:51

抽象类的特点:

  • 不能实例化对象;
  • 类中可以定义抽象方法(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(),在构造派生类实例时,都会先调用这个默认构造方法。
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())

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!