继承:
1. 继承是复用代码的有效途径。继承中,子类拥有父类非私有的成员。形象地讲,继承是把除父类私有成员和父类构造方法以外的所有代码复制一份到子类中,这样减少了代码,增加了代码的复用。
2. 类之间只允许单继承。所有的类直接或者间接继承了object 类,如果在使用中要用到多重继承,可以使用间接继承。即:
class Fruit extends Plant{} // 水果继承了植物类
class Apple extends Fruit {} // 苹果继承了水果类
这样苹果既有了水果类的属性和方法,又具有了植物类的属性和方法,“曲线救国”。
其实,我们在平时的使用中,都用过间接继承,因为Object 是所有类的超类,当我们在写一个类时,例如:class A {}; 虽然这里没有写A类的父类,但是编译器默认不管是系统定义的类还是自己写的类都会继承Object 类,所以A 类继承了Object 类,即class A extends Object{} ;而当我们写一个类继承A类时,即class B extends A {}; 这样这里的关系就好像苹果—水果—植物的关系一样了。但是在平时的编写中,我们都是写class A{}的。
3. 继承中,在子类中重写父类中的成员变量,可以隐藏父类中的成员变量。同样也可以覆盖方法。
例子:
class Plant { //植物类
String name;
public void sun(){
System.out.println("I want to sun...");
}
public void print(){
System.out.println("In class Plant, My name is " + name);
}
}
class Fruit extends Plant { // 水果类继承植物类
String name;
public void print(){
System.out.println("In class Fruit, My name is " + name);
}
}
class Apple extends Fruit { // 苹果类继承水果类,间接继承植物类
String name;
public void print(){
System.out.println("In class Apple, My name is " + super.name);
}
public void sun(){
System.out.println("I want to a little sun....");
}
}
public class Test2 {
public static void main(String[] args){
Plant p = new Fruit(); // 父类引用指向子类对象
p.name = "p----->Apple"; // 这个name 是Plant 类中的方法。
p.print(); /* 因为fruit 类对Plant 类的print()方法进行了覆盖,所以这个print 方法是类Fruit中的。*/
Plant p2 = new Apple();
p2.name = "p2---->Apple";
p2.print();
}
}
接口:
1. 接口就是将“做什么”与“怎么做”进行了分离。虽然代码量增加了,但是这样做给java 带来了很大的灵活性,加强了程序的可维护性。
2. 接口里面的方法,全部都是抽象方法。如果有成员变量,这必须进行初始化,并且这个成员变量是public static final 。
3. 接口的是实现可以使用关键字implements 。如果子类没有完全实现接口的方法时,此类则为抽象类,必须声明为abstract ,因为若一个类中含有抽象方法时,则此类必须被声明为抽象类。
4. 每个类可以实现多个接口。
例子:
interface Plant{
public abstract void sun();
}
interface Fruit{
public abstract void print();
}
class Apple implements Fruit, Plant{
String name;
public void sun(){
System.out.println("I want to a little sun...");
}
public void print(){
System.out.println("My name is " + name);
}
}
public class Test {
public static void main(String[] args){
Apple a = new Apple();
a.name = "Apple";
a.sun();
a.print();
}
}
例子和刚才的一样,只不过这里是用interface 实现的。
继承和接口的区别:
1. 继承只允许单继承,虽然可以用“曲线救国”,对父类进行继承,对父类的父类进行继承等,可是如果一旦出错要进行修改的话,那将是一件很头疼的事情。而接口就可以避免这种情况。将内容或者功能要更换时,只需把实现接口中的类的内容换去即可。而且接口允许多次实现。