Java语言中的很重要的功能,继承与接口。继承可以让你在不同的类中共享代码,接口可以用统一的方法处理几个不同的类的对象。Android中用了大量的继承,需要掌握。
面向对象的程序设计引入了继承机制,大大提高了复用代码的能力。我们可以让一个类在另一个类的基础上进行扩充,还有助于让程序建立在具有层次关系的对象类型上,使得程序在逻辑上清晰。
父类与子类
举例说明:Employee的子类Secretary
public class Employee {
public int gethour()
{
return 40;
}
public double getsalary()
{
return 4000.0;
}
public String getVacationForm()
{
return "Yellow";
}
}
public class Secretary extends Employee {
public void takeDictation(String text)
{
System.out.println("Dictating text :"+text);
}
}
使用方法
public class Main {
public static void main(String[] args) {
Employee edna=new Employee();
System.out.println("他每周工作时间"+edna.gethour());
Secretary le=new Secretary();
System.out.println("她每周的工作时间"+le.gethour());
le.takeDictation("听写");
}
}
重写方法:
继承得到的类,不可避免的部分需要对父类进行修改和替换。在子类中提供父类的某些方法的另一个实现版本,用来替换父类继承而来的实现方法。这种替换父类的某些行为的特性称之为重写。
public class Lawyer extends Employee {
public String getVacationForm(String text)
{
return "pink";
}
public void use()
{
System.out.println("I am the king");
}
}
public class LegalSecretary extends Secretary//继承子类。
{
public double getSalary()
{
return 4411.0;
}
}
与父类进行交互
希望派生的类全面继承父类的字段,方法和构造函数。这种情况下,我们需要子类于父类进行更为复杂的交互过程,因此引入了一个新的关键字super。Java提供了super来表示父类。可以通过这个关键字调用父类的方法或构造函数。super只能调用上一层父类的内容,不存在super.super的情况。
例如
public class LegalSecretary extends Secretary {
public double getSalary()
{
return super.getSalary()+1001;
}
}
访问继承的字段
子类不能访问父类的私有字段,需要父类提供相关的访问器来进行访问。
调用父类的构造函数
与父类中的其他方法不同,父类的构造函数不能被子类继承。必须为子类编写自己的构造函数,还可能会遇到不能访问父类私有字段而造成的问题。
问题1:子类虽然继承了父类的各种字段,但是他不能访问那些私有的字段。
问题2:继承的机制要求子类的构造函数必须调用父类的构造函数。本质上说,子类的对象依然是父类的对象,因此必然也会调用父类的构造函数,但是子类对象不调用构造函数,那么编译器就去找父类的不带参数的构造函数,但是父类不存在不带参数的构造函数,那么就会报错。解决方法就是在子类的构造函数中显式的调用父类的构造函数。super(***);
Object类
Object类是所有类的父类,任何类都是他的子类。有时候我们也需要在程序中使用Object类型,比如:我希望某个方法可以接受任何类型的对象作为参数,那么就可以将参数声明为Object类型。
Java中的“==”比较的这两个类是不是同一个东西,而不是他们的状态是否相同(对数字还是准确的)。比较状态相同利用equals方法,系统会为没有提供equals方法的类提供一个最简单的缺省方法,这时的equals与“==”的功能是相同的,因此我们需要编写一个equals方法来取代。
注意:如果我们的类中的某些字段是对象,那么就得使用equals方法,切记不能使用==.
instanceof关键字,用来检测变量是否指向某个类型的对象,避免不同的对象转换造成异常。注意,instanceof会认为子类是true,而检测中却会认为父类为false。例如Point和Point3D问题,这说明继承并不是解决问题的最好的方法,因此重写一个3D类会解决许多的麻烦。引出了Java的可替换性:在任何需要使用父类对象的地方都可以有它的一个子类对象来代替的特性。反之不成立。
public boolean eauals(Object o)
{
if(o instanceof Point)
{
Point other=(Point) o;
retuarn ...
}
else
{
return false;
}
}
很多人不可避免的需要法律方面的帮助,但绝大多数人都选择找一个律师,而不是让自己成为一名律师。因此类也是这样,一个对象可以将另一个对象用作自己状态的一部分,我们称这种关系为“有一个的”关系。
接口
Java摒弃了c++的多继承机制,但提供了接口的方法来解决需要多继承的问题,并且可以利用接口来实现多态性。可以利用接口来作为多个类的共同父类型,而且不会涉及代码共享。举个栗子:我们需要求出各个图形的面积,并且还需要把这些图形的面积存起来。但是显然不同的图形求面积的方法是不一样的。(接触的少,没找着栗子)
注意:1.接口不能有body,意味着他只是单纯的提供一个方法的声明。不会含有{};
2.不包含字段。
3.接口声明的方法,它的参数的个数和类型不可以改变。(不可以重载?)
4.实现接口的类,必须实现接口中的所有方法。
5.接口总是出现在继承层次关系的顶部,通过实现接口,类可以进入层次关系之中,而不必丧失它唯一的一次继承的机会。