Java之抽象+多态的简单应用

一、抽象

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);

	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42194284/article/details/90084466