1、继承
由于一个对象功能的单一性,我们想对其进行扩展,但想保留其属性和功能,我们就必须用到继承。
java继承的特性:
单继承:java里的对象不同于C++,只能进行单继承,即一个对象只能有一个父亲
多级继承:也即虽然只能有一个父亲,但是可以拥有爷爷,太爷爷。太太爷......
1.1抽象类:
**抽象:抽象的具体含义是将对象的具体特点抽出来,比如学生有成绩,学号,性别等属性,有考试,写作业等功能;**
定以一个抽象类,抽象类里的方法不需要具体写出来。只需要将函数列举出来即可。
比如定义一个抽象动物类:
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
这个动物可以吃饭和睡觉,你不需要具体的写出来他是如何吃饭的,具体的写法只能在子类中列出来,而且是必须对父类的方法进行沿用详写:
public class Dog extends Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
}
1.2接口:
接口的作用:弥补java单继承的缺点
书上经常把抽象类和接口放在一起,其实是有道理的。抽象类和接口非常的相似,写抽象类和接口时都不需要将其具体的功能特点写出来,而是在子类中去写,不同的是抽象类是类,接口是接口本身。接口可以有多个,而继承只能单继承
接口的定义:
public interface AnimalB {
void eat();
void sleep();
}
接口的用法:
public class Dog implements AnimalB {
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
}
2、多态
事实上多态是建立在继承基础上的,所以要学习多态必须先将继承学好。而学习多态就是学习它的两大特点
多态的两大特点:重写@Override和重载
2.1重写
为什么要重写?
如果对父类的功能不满意,就可以对其进行重写覆盖。你可以保留原有功能增加新的功能也可以覆盖原有的功能。
Animal类
public class Animal {
void eat() {
System.out.println("我会吃饭");
}
}
子类重写Animal类
public class Dog extends Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("我喜欢吃肉");
System.out.println("我喜欢吃骨头");
}
}
引用Dog对象,最终出现的是Dog里的eat()函数
public class test_01 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
}
}
这就是最简单的重写。
2.2重载
重载指的是子类对象里有一个或多个和父类的方法相同名字的函数;
可通过改变参数中的类型,数量,顺序来实现对同名方法的重写。
另区别:Dog dog = new Dog();
Animal dog = new Dog();
前者相对而言要广一点,如果子类中添加了war()函数,前者可以通过dog.war调用,而后者会报错