第六章-抽象类与接口

抽象类的特点:

  • 不能实例化对象;
  • 类中可以定义抽象方法(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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值