什么是继承?
继承是对现实生活中的“分类”概念的一种模拟。
狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是“继承”关系的重要特性:通常简称为“IS_A”关系
class 子类名 extends 父类名
{......}
父类(parent class)和
超类(super class)通常指直接上级
基类(base class)
通常指包括直接上级在内的“上级的上级”
在Java中实现继承时
子类自动拥有父类声明为public和protected的成员,这就是继承特性的体现之一。
而继承条件下类的访问权限方面
public:外界可自由访问;
private: 外界不可访问;
protected: 同一包中的子类都可以访问,另一包中的子类(派生于同一个父类)也可以访问;
default: 如果不指明任何权限,则默认同一包中的类可以访问;
在子类的构造方法运行前,必须调用父亲的构造方法,不能反过来。
不允许继承的类
创建“不可变的类”的对象后,此对象的属性不可改,而且也无法从此类派生出新子类。String就是一个典型的例子。
不可变的“类”有何用?
可以方便和安全地用于多线程环境中, 访问它们可以不用加锁,因而能提供较高的性能。
final class 类名
{......}
以final声明的方法不允许覆盖。
以final声明的变量不允许更改。
利用final,可以设计出一种特殊的“只读” 的“不可变类”。
不可变类的实例:
public final class Address
{
private final String detail;
private final String postCode;
//在构造方法里初始化两个实例属性
public Address()
{
this.detail = "";
this.postCode = "";
}
public Address(String detail , String postCode)
{
this.detail = detail;
this.postCode = postCode;
}
//仅为两个实例属性提供getter方法
public String getDetail()
{
return this.detail;
}
public String getPostCode()
{
return this.postCode;
}
//重写equals方法,判断两个对象是否相等。
public boolean equals(Object obj)
{
if (obj instanceof Address)
{
Address ad = (Address)obj;
if (this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode()))
{
return true;
}
}
return false;
}
public int hashCode()
{
return detail.hashCode() + postCode.hashCode();
}
}
由于Java并未对子类方法的命名做过多的限制,因此,子类与父类各自定义的方法之间,可以出现以下三种情况
扩充(Extends):子类定义的方法父类没有同名
覆盖/重写(Override):子类父类定义了完全一样的方法
重载(Overloads):子类有父类的同名方法,但两者的参数类型或参数数目不一样
多态:
掌握多态概念的关键点
简单的说法: 相同的一条语句,在不同的运行环境中可以产生不同的运行结果。
多态的最本质特征就是父类(或接口)变量可以引用子类(或实现了接口的类)对象。换句话说:子类对象可以被当成基类对象使用!
其典型代码如下所示: Parent p=new Child(); IMyClass obj=new MyClass(); 总是可以让更一般的对象容纳更具体化的对象. 特别地,Java类库的最顶层类是Object。因此每个对象都可以赋值给Object变量。
总结(1):子类父类拥有同名的方法时……
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。
总结(2):子类父类拥有同名的方法时……
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
牢记:在实际开发中,要避免在子类中定义与父类同名 的字段。不要自找麻烦!——但考试除外,考试 中出这种题还是可以的。
抽象类和抽象方法
有abstract修饰的类称为“抽象类”,它只定义了什么方法应该存在,不能创建对象,必须派生出一个子类,并在子类中实现其未实现的方法之后,才能使用new关键字创建对象。
在方法前加上abstract就形成抽象方法,只有方法声明,没有实现代码
抽象类、抽象方法实例
abstract class Person
{
public abstract String getDescription();
/}
一个抽象类中可以包含非抽象方法和成员变量。包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法
抽象类不能创建对象,一般用它来引用子类对象。
从抽象类继承的子类必须实现父类的所有抽象方法,否则,它仍然是抽象类
标签:String,子类,多态,public,课后,抽象类,父类,方法,第四 From: https://www.cnblogs.com/sion6/p/16796798.html