【JAVA】多态与抽象类

多态中父类引用指向子类对象,且只有父类引用能指向父类自己,函数被重载与重写。在用依赖和关联时,随着客户需求的不断增加,我们的代码就显得臃肿。为了减少重复性的工作,我们就需要创建一个父类。让其他类继承它,让代码的复用率、效率和拓展性增加。

抽象类,顾名思义,它不是一个具体的类。抽象类和一般类没有太大差异,该怎么描述事物就怎么描述,只不过出现了一些看不懂的东西。而这些不确定的部分,也是该事物的功能,需要被明确。又因为其无法被定义出主体,只能通过抽象方法来体现。抽象类里头可以不定义抽象方法,主要是为了不让该类被new创建和实例化对象,因为抽象类是不完整的,且调用抽象方法是无意义的;抽象方法必须包含在抽象类中。从继承方面来讲,如果子类只包含了部分抽象方法,那该子类还是一个抽象类。

abstract 关键字,和哪些关键字不能共存。
final:被final修饰的类不能有子类(不能被继承)。而被abstract修饰的类一定是一个父类(一定要被继承)。
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。
而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。
可是抽象方法运行没意义。

多态例题

public class Chinese extends Person{

	public Chinese(String name) {
		super(name);
	}
	public void speak() {
		System.out.println("中文");
	}
}
public class College extends Student{
	private int subject;

	public College() {
		super("张三",23234,'M');
	}

	public void study() {
		super.study();
		//只能在子类里面调用父类的方法,
		//在外部无继承的类里不能被调到。
		System.out.println("学习高数!");
		System.out.println("学习外语!");
		System.out.println("学习物理!");
	}

	public int getSubject() {
		return subject;
	}

	public void setSubject(int subject) {
		this.subject = subject;
	}
}

public class Student {
	private String name;
	private int id;
	private char sex;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		if(sex=='M'||sex=='F') {
		this.sex = sex;
		}		
	}
	
//	public void setProp(String name,int id,char sex) {
//			this.setName(name);
//			this.setId(id);
//			this.setSex(sex);
//		}
		
	public void study() {
		System.out.println("学习!");
	}

	
	public Student(String name,int id,char sex) {
			this.setName(name);
			this.setId(id);
			this.setSex(sex);
		}
}

任务一

public class Test1 {
	public static void main(String[] args) {
		Student s=new Student("张三",232234,'M');
		College c=new College();
//		s.study();
//		c.study();
//		c.study();
		s=c;//多态
		s.study();
//在子类外部,只能调用子类里面继承父类的属性,重写除外。
		s.setName("");
		s.setId(232234);
		s.setSex('M');
		c.setSubject(42134);
		
	}
}

任务二

public class Test_polymorphic {
	public static void main(String[] args) {
		Person p = new Chinese("张三");
		Coke c = new Coke();
		p.eat(c);
		Duck d = new Duck();
		p.eat(d);
		Fish f = new Fish();
		p.eat(f);

		// 调用抽象类之后,我们就不能再重新创建该类。
		// Food aa=new Food();
		// p.eat(aa);
	}
}

任务三

public class StudentTest {
	public static void main(String[] args) {
//		Student s=new Student();
//		当有了有参构造函数,
//		编译器就不会分配默认构造函数了。
		
		Student s=new Student("张三",232234,'M');
//		调用有参构造函数
//		s.setName("张三");
//		s.setCode(232234);
//		s.setSex('M');
	}
}

抽象类、抽象方法例题

public class Coke extends Food{
//	private String name = "芦花鸡";
//
//	public String getName() {
//		return name;
//	}
//
//	public void setName(String name) {
//		this.name = name;
//	}
	public Coke() {
		super.setName("芦花鸡");
	}
}
public class Duck extends Food {
	public Duck() {
		super.setName("芦花鸭");
	}

}
public class Fish extends Food {
	public Fish() {
		super.setName("甲鱼");
	}
}
public abstract /* 抽象类 */class Food {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
public abstract class Person {
	private String name;

	public Person(String name) {
		super();
		this.name = name;
	}

	// //依赖
	// public void eat(Coke c) {
	// System.out.println(this.name+"吃"+c.getName());
	// }
	//
	// public void eat(Duck c) {
	// System.out.println(this.name+"吃"+c.getName());
	// }

	public void eat(Food c) {
		System.out.println(this.name + "吃" + c.getName());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;

	// 抽象方法:public void speak();也可写为public abstract void speak();
	// 没有大括号的方法为抽象方法
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_临渔_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值