Java学习笔记——类的继承
继承就是从已有的类(父类)产生一个新的子类,子类通过继承自动拥有父类的非私有的属性和方法,继承是实现类的重用、软件复用的重要手段。
- 继承的语法格式:
class 子类名称 extends 父类名称{
//扩充或修改的属性与方法;
}
要点
- Java 中的单继承机制:一个类只能有一个直接父类;
- final修饰的类不能有子类;String是典型特例
- Object类是所有Java类的顶级父类。
从本质上讲,实例化子类对象时系统会先调用父类的构造方法,然后再调用子类的构造方法。
当父类含有含参数的构造方法时,系统不默认提供不含参数的构造方法。
– 解决方法一:在父类中定义无参数的构造方法。
– 解决方法二:在子类中显示调用父类中定义的构造方法。
在构造函数中,**super();**必须是方法体内的第一句,使用super调用不一定调用无参函数
//显示调用父类的构造方法;访问父类的属性和方法(位置不限)
子类只能访问父类中的非private(私有)类型的属性或方法。
- super调用父类的属性
–只能访问父类非private类型的属性
–使用 super.属性名称 的形式,位置不固定
–用来访问父类被隐藏的的成员变量
–用来调用父类中被重载的方法
this关键字调用本类的属性和方法;super调用父类的属性和方法
两种方法不能同时出现。
方法重写
在继承机制中子类继承了父类的属性和方法,同时还可以对父类中的属性和方法做进一步的扩充或者修改;子类对父类中声明(定义)的方法进行重新实现的改造称为方法重写(override)。
重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。重写的主要优点是能够定义某个子类型特有的行为。
重写和重载是继承的一个基础
子类重写父类方法时,子类中的权限符不能低于父类的权限
重写只能出现在继承关系之中,且方法名,参数列表,返回值类型一致
重载发生在继承关系的两个类中,方法名相同,参数列表不同,返回值可以不同
重写方法可以实现多态:
父类的引用可以指向子类的对象:向上转型。
指向子类的对象的父类类型的引用可以调用父类中定义的属性和方法。
指向子类的对象的父类类型的引用无法调用子类中定义而父类中没有的方法。
抽象类
abstract修饰的类称为抽象类,抽象类的特点:
- 不能实例化对象,可以定义抽象类的引用;
- 包含抽象方法的类必须定义为抽象类
- 抽象方法不含方法体,必须显式定义为abstract
- 抽象类中可以没有抽象方法。
抽象方法只有方法的声明没有方法实现,即没有方法体。
例如:
abstract class Animal {
private String color ;
public abstract void shout();
}
子类继承抽象类必须实现抽象类中所有的抽象方法,否则子类也必须定义为抽象类。
接口
Java中的接口是一系列方法的声明,是一些方法特征的集合,接口可以看做是一种特殊的抽象类,其中包含常量和方法的声明,而没有变量和方法的实现。
- 接口的定义语法:
public interface 接口名称 { //接口名称与文件名相同
-常量声明,即使没有final修饰,必须初始化,不能修改
//权限是公有的,即使没有public修饰,其他允许的修饰符可以是static或final
-接口中的抽象方法声明,即使没有abstract修饰,必须没有方法实现
//权限是公有的,即使没有public修饰,其他允许的修饰符:static,不可以是final
} - 类可以通过实现接口的方式来具有接口中定义的功能,基本语法:
class 类名 implements 接口名 {
……
}
Java中接口的继承是多继承机制,即一个接口可以同时继承多个接口(extends),一个类可以实现1个或多个接口(implements)
接口类不能实例化对象,可以定义接口类型的引用
接口不能继承类
一个类实现接口必须实现接口中所有的抽象方法,否则必须定义为抽象类。 - 接口继承的基本语法 :
interface 接口名 extends 父接口1,父接口2,……{
……
}
Object类
Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
可以使用类型为Object的变量指向任意类型的对象。
Object类有一个默认构造方法 pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。
Object类的变量只能用作各种值的通用持有者。要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。
例如:
Object obj = new MyObject();
MyObject x = (MyObject) obj;
- equals(Object obj)
指示某个其他对象是否与此对象“相等”。
== 判断所指对象地址是否相同
在Object类中的实现是判断两个对象是否指向同一块内存区域。
在String和包装器类中重写了equals方法,判断对象的值是否相同
–例1:String s1=”abc”; String s2=”abc”; ==相等 equals()相等
–例2:String s1=new String(“abc”); String s2=new String(“abc”);
== 不相等 //两个变量的内存地址不一样,故不相等。
equals() 相等//两个变量的所包含的内容是abc,故相等。 - hashCode()
返回该对象的哈希码值。
–public int hashCode() 返回该对象的哈希码值。 - toString()
–返回该对象的字符串表示。
–public String toString() 返回该对象的字符串表示。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、 “@”和此对象哈希码的无符号十六进制表示组成。
–getClass().getName() + ‘@’ + Integer.toHexString(hashCode()) - getClass()
返回一个对象的运行时类。 - finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。