一、抽象
1.抽象:使用abstract声明的类叫作抽象类,当父类的某些方法不确定,就可以用抽象类。
(1)抽象类是一种模板,不能被实例化;
(2)子类继承抽象类,如果子类不是抽象类,就要实现基类中全部的抽象方法;如果子类是抽象类,可以不用写抽象方法、也可以重写抽象方法;
2.抽象类和接口的区别
(1)抽象方法是抽象类里边的;
(2)抽象方法是相对接口而言的,接口必须实现基类中的全部方法,抽象类只实现抽象方法,不用实现普通方法
二、多态
1.多态:同一种行为,在子类中有有不同的体现。多态分为运行时多态和编译时多态。
2.实现多态需要做的3件事:
(1)继承
(2)重写
(3)父类的引用指向子类的对象;
例:父类 Person 子类 Student,可以这样定义 Person p = new Student();
三、代码:抽象+多态
package practice;
public class Student2 {
private String name;
private char sex;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(char sex) {
if (sex=='M'||sex=='F')
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setprop(){
this.setName(name);
this.setId(id);
this.setSex(sex);
}
public Student2() {};
public Student2(String name,char sex,int id) {
this.setName(name);
this.setSex(sex);
this.setId(id);
}
public void study() {
System.out.println("study!");
}
}
package practice;
public class college extends Student2 {
private String subject;
public college() {
super("Tom",'男',67);
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void study() {
// super.study();
System.out.println("study Math,English,Computer......");
}
//重载是函数名字相同但参数不一样,重写是写一个一模一样的定义,但是在函数体里的实现不一样
}
package practice;
public class Test2 {
public static void main(String[] args) {//主函数的形参
Student2 r=new Student2("tom",'男',89);
college w=new college();
w.study();//调用的是自己的study()函数,要想调用父类的可以自函数体里调用
r.study();
r=w;//多态
r.study();//调用的是子类的study();
//只能访问子类里面继承下来父类定义的东西,除了重写的函数,它调用的的子类的函数
r.setName("Laurence");
r.setId(89);
r.setSex('男');
// r.setSubject("english");子类里的新函数父类是调不到的
}
}
package practice;
//今日重点:区别关联和依赖,重写和重载;对象的交互;多态性
public class ji extends food{
public ji(){
this.setName("宫保鸡丁");
}
}
package practice;
public class duck extends food{
public duck(){
this.setName("北京烤鸭");
}
}
package practice;
public abstract class food {//food is a 抽象类,只做引用用,在计算计里面没有实例。
//所以,它分配内存是没有意义的,没有必要将它new出来。
//抽象类就是给别的类继承的
private String name;
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
}
package practice;
public class testduotai {
public static void main(String[] args) {
person1 p = new Chinese("张三");
ji c = new ji();
p.eat(c);
duck d = new duck();
p.eat(d);
// food aa=new food();//food is a 抽象类,所以没法实例化对象
// p.eat(aa);
}
}