目录
一、继承的概念
二、Java 方法重写
三、Object类
方法
四、final关键字
final 变量
五、Java 多态
一、继承的概念
Java 继承
子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。
从另一个类继承一个类非常简单。我们在子类的类声明中使用关键字extends,后跟超类名称。
Java不支持多重继承的实现。
Java中的类不能有多个超类。
一般的语法是
<class modifiers>class <SubclassName> extends <SuperclassName> {
// Code for the Subclass
}
以下代码显示如何使用从Employee类创建Manager类。
class Employee {
private String name = "Unknown";
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Manager extends Employee {
}
public class Main {
public static void main(String[] args) {
// Create an object of the Manager class
Manager mgr = new Manager();
// Set the name of the manager
mgr.setName("Tom");
// Get the name of the manager
String mgrName = mgr.getName();
// Display the manager name
System.out.println("Manager Name: " + mgrName);
}
}
上面的代码生成以下结果。
二、Java 方法重写
让我们考虑类A和类B的以下声明:
public class A { public void print() { System.out.println("A"); } } public class B extends A { public void print() { System.out.println("B"); } }
类B是类A的子类。类B从其超类继承print()方法并重新定义它。
类B中的print()方法覆盖类A的print()方法。
如果一个类覆盖了一个方法,它会影响覆盖的类及其子类。考虑下面的类C的声明:
public class C extends B { // Inherits B.print() }
类C不声明任何方法。它继承类B中的print()方法。
注意
类总是继承它的直接超类的可用的。
方法必须是实例方法。重写不适用于静态方法。
重写方法必须具有与重写方法相同的名称。
重写方法必须具有与重写方法相同顺序的相同类型的相同数量的参数。
当方法的参数使用通用类型时,考虑通用类型参数的擦除,而不是通用类型本身与其他方法比较。
参数的名称无关紧要。
如果重写方法的返回类型是引用类型,则重写方法的返回类型必须与重写方法的返回类型兼容。
访问级别
重写方法的访问级别必须至少与重写方法的访问级别相同或更宽松。
下表列出了重写方法允许的访问级别
方法可以在其throws子句中包括检查异常的列表。重写方法无法向重写方法中的异常列表添加新的异常。
它可以删除一个或所有异常,或者可以用另一个异常替换异常。
三、Object类
Java在java.lang包中有一个Object类。
所有Java类都直接或间接扩展Object类。
所有Java类都是Object类的子类Object类是所有类的超类。
Object类本身没有超类。
Object类的引用变量可以保存任何类的对象的引用。
以下代码声明对象类型的引用变量obj:
Object obj;
方法
Object类有九个方法,可以在Java中的所有类中使用。
- public String toString()
它是实现在Object类中,我们可以自定义它。
它返回对象的字符串表示形式。
通常,它用于调试目的。- public boolean equals(Object obj)
它在Object类中实现,我们可以自定义它。
它用于比较两个对象的相等性。- public int hashCode()
它在Object类中实现,我们可以自定义它。
它返回对象的哈希码(整数)值。- protected Object clone() throws
CloneNotSupportedException
它不在Object类中实现,我们可以通过覆盖克隆方法来自定义它。
它用于创建对象的副本。- protected void finalize() throws Throwable
它不是在Object类中实现,我们可以自定义它
它在对象被销毁之前被垃圾收集器调用。- public final Class getClass()
它在Object类中实现,我们不能自定义它。
它返回对对象的Class对象的引用。- public final void notify()
它是在Object类中实现的,我们不能自定义它。
此方法通知对象的等待队列中的一个线程。- public final void notifyAll()
它是在Object类中实现的,我们不能自定义它。
此方法通知对象的等待队列中的所有线程。- public final void wait() throws InterruptedException
public final void wait(long timeout) throws InterruptedException
public final void wait (long timeout, int nanos) throws InterruptedException
它是在Object类中实现的,我们不能自定义它。
使对象的等待队列中的线程等待,无论是否超时。以下代码显示如何重新实现Object类的toString()方法。
public class Test { public String toString() { return "Here is a string"; } }
四、final关键字
Java final关键字
final关键字不允许修改或替换其原始值或定义。
final关键字可以在以下三个上下文中使用:
- 变量声明
- 类声明
- 方法声明
final 变量
如果一个变量被声明为final,它只能被赋值一次。最终变量的值在设置后不能修改。
变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。
变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。
final int YES = 1;
我们可以只设置一次final变量的值。
有两种方法来初始化final变量:
- 在声明时予以初始化。
- 将其初始化延迟到稍后的时间。
但是,我们必须在第一次读取最终变量之前初始化它。
- final局部变量
你可以声明一个局部变量final。如果将局部变量声明为空的最终变量,则必须在使用前初始化它。- final参数
我们可以声明一个参数final。当调用方法或构造函数时,参数将使用实际参数的值自动初始化。
因此,您不能更改方法或构造函数体内的最终形式参数的值。- final实例变量
我们可以声明一个实例变量final和blank final。
空白最终实例变量必须初始化一次,并且只有在调用类的任何构造函数时才初始化一次。- final类变量
我们可以声明一个类变量final和blank final。我们必须在其中一个静态初始化器中初始化一个空的最终类变量。- final引用变量
引用变量存储对象的引用。最终引用变量意味着,一旦引用一个对象(或null),它就不能被修改以引用另一个对象。以下代码显示了test2()方法的最终形式参数x:
public void test2(final int x) {
如果我们有一个类的多个静态初始化器,我们必须在一个静态初始化器中初始化所有空的最终类变量一次。
public class Main { public static final int YES = 1; public static final int NO = 2; public static final String MSG; static { MSG = "final static variable"; } }
五、Java 多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态性是对象多种表现形式的体现。
比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。那么我到宠物店说"请给我一只宠物",服务员给我小猫、小狗或者蜥蜴都可以,我们就说"宠物"这个对象就具备多态性。
接下来让我们通过实例来了解Java的多态。
public interface Vegetarian{} public class Animal{} public class Deer extends Animal implements Vegetarian{}
因为Deer类具有多重继承,所以它具有多态性。以上实例解析如下:
- 一个 Deer IS-A(是一个) Animal
- 一个 Deer IS-A(是一个) Vegetarian
- 一个 Deer IS-A(是一个) Deer
- 一个 Deer IS-A(是一个)Object
在Java中,所有的对象都具有多态性,因为任何对象都能通过IS-A测试的类型和Object类。
访问一个对象的唯一方法就是通过引用型变量。
引用型变量只能有一种类型,一旦被声明,引用型变量的类型就不能被改变了。
引用型变量不仅能够被重置为其他对象,前提是这些对象没有被声明为final。还可以引用和它类型相同的或者相兼容的对象。它可以声明为类类型或者接口类型。
当我们将引用型变量应用于Deer对象的引用时,下面的声明是合法的:
Deer d = new Deer(); Animal a = d; Vegetarian v = d; Object o = d;
所有的引用型变量d,a,v,o都指向堆中相同的Deer对象。