继承(一)

继承要讲授8个知识点,分别是①类、超类和子类②Object:所有类的超类③泛型数组列表④对象包装器与自动装箱⑤参数变量可变的方法⑥枚举类⑦反射⑧继承设计的技巧

一、类、超类和子类

1、定义子类

extend表明构造的类派生于一个已存在的类,这个已存在的类称为超类或者父类,新构造的类称为子类。

public class Mananger extend Employee{

 

}

子类可以获取父类已经定义好的属性、方法,除此之外,还可以定义自己的特有成分,子类是对父类功能的扩展,当父类定义的是私有属性/方法时,子类同样可以获取得到,只不过由于封装性,不可以直接调用。

2、覆盖方法

父类中的方法可能并不适用于子类,在子类中需要对方法进行重新覆盖(重载)

如在父类中有get.salary()方法

在子类要重新定义salary()方法,除了可以调用原父类的方法外,也可以在里面

public class Mananger extend Employee{

public double getSalary(){

double baseSalary= super.getSalary//super关键字调用超类的方法,也可以调用超类的构造器

//super(name,salary,year,month,day)

return baseSalary+bouns

}

}

3、子类构造器

Mannger类的构造器不能访问Employee类的私有域,所有必须利用Employee的构造器对这部分进行实例化,可以通过super实现对超类构造器的调用,使用super调用构造器的语句必须是子类构造器的第一条语句。

如过子类中没有显示的调用构造器,那么就会默认调用不带参数的构造器,如果父类中没有不带参数的构造器,并且在子类的构造器中又没有显示的调用调用父类中的其它构造器,则会产生编译错误。

4、继承层次

由一个公共类派生出来的所有类的集合被称为继承层次,在继承层次中,从某个特定的类到其祖先的路径被称为该类的继承链。

5、多态

概念:允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的方式,

实现多态的技术称为动态绑定,它是在执行期间判断所引用对象的实际类型,根据实际类型调用相应的方法。

其实质就是多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。

 

多态的作用:

1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。

2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性

例子:

比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

6、理解方法

①编译器会首先查看对象的声明类型和方法名。(列举该类中的方法名f和父类中被修饰为public的方法名f)

②编译器查看调用方法时提供的参数类型(找一个参数类型匹配的,先找子类,再找父类)

③如果是private方法,static、final方法或者构造器,那么编译器可以准确的知道调用哪个方法,这种方式称为静态绑定。当调用方法以来一遍隐式参数的实际类型,并且在运行时实现动态绑定

④当程序运行采用动态绑定时,虚拟机会查找的与该参数相对应的方法,虚拟机预先为每个类创建一个方法表。

 

如在运行e.getSalary()方法时,虚拟机提取e的实际类型方法表,接下来虚拟机会搜索定义getSalary签名的类,此时的虚拟机已经知道应该调用那个方法,最后,虚拟机调用方法。

在覆盖一个父类的方法时,子类的方法的可见性不得低于父类的可见性。

 

7、阻止继承:final类和方法

如果将一个类声明为final,其中的方法会自动的成为final,不包括域。

被final定义的类不可以被继承。

 

8、强制类型转换

不仅基本数据类型可以强制转换,对象也可以

定义类Employye,它的子类Mannger

①向上转型(父类对象引用子类的对象)

Employe e=new Mannger();

e.getSalary(),调用的是子类的方法

②向下转型

会出现错误,在向上转型时,可以说麻雀是鸟,但不能说鸟是麻雀。

9、抽象类

当父类中的方法不具有通用性时,需要将父类中的方法定义为抽象方法,则这个类就需要定义为抽象类,抽象方法没有方法体,类即使不含抽象方法,也可以定义为抽象类。

public abstarct class Mananger extend Employee{

private String name;

public String getName(){

this.name=name;

}

public abstract double getSalary();

}

10、受保护访问

Private: 仅对本类可见

Public:对所有类可见

protected:对本包和所有子类可见

默认:对本包可见

 

二、Object、所有类的超类

1、概念

Object类时所有java类的祖先,每个类都使用Object类作为父类,所有对象(包括数组)都实现这个类的方法。

Object类有一个默认构造方法 public Object(),在构造类的实例时,都会调用这个构造器方法。

2、方法

①Object默认构造器

②equals()

判断两个对象是否相等,它是比较对象的内存地址,==比较内存中存放的地址(即比较值)

③hashcode(返回该对象的哈希码值)

hashCode 的常规协定是(重写equals()时,必须重写hashcode()并保证此协定):

如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等

如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同

如果两个对象的hashcode值不等,则equals方法得到的结果必定为false

如果两个对象的hashcode值相等,则equals方法得到的结果未知

④toString()  返回该对象的字符串表示

Object类中的toString()方法会打印出类名和对象的内存位置。几乎每个类都会覆盖该方法,以便打印对该对象当前状态的表示。

⑤clone()

浅克隆仅拷贝对象本身和对象的基本变量,而不拷贝对象包含的引用指向对象。

深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

 

 

 

 

 

 

 

 

 

 

发布了71 篇原创文章 · 获赞 42 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/dreame_life/article/details/102608300