JAVA零基础小白自学日志——第二十天


今日提要:抽象类
你以为这几天看的内容都是多态?你太小看Java了,咱们来看看真正多态的入门

1.为什么我们需要抽象类

  • 我们先来建立一个超类class Person{........},不用解释吧,这是个人类,先放在这里,我们往下说;
    你要出出门碰见一个人要打招呼,你会说什么呢,最简单的方式就是“先生,你好!”,“女士,你好!”,从这两句话里我们其实进行了一系列的操作,首先,我们以人类为依据,为这个人类创建了两个子类“男人”和“女人”,并且实例化了子类,如果我们将上面的话默认部分都说出来,就容易理解了“先生,你好!”=“这位先生,你好!”,“女士,你好!”=“这位女士,你好!”,这都变成代码其实就是这样的
public class TestOne {

	public static void main(String[] args) {
	    Person a = new Male();
	    Person b = new Female();		

	}

}
class Person{
    //......
}
class Male extends Person{
    //......
}
class Female extends Person{
    //......
}
  • 你看了看不以为然的说道,我就要实例化人类Person a = new Person(),好吧,一切听你的,你今天出门遇到一个人,然后你远远挥舞着你的手对着那个人就打了个招呼,“嗨,你好啊!人类!”,那个人迷茫的看着你回应道:“嗨,你也好啊!人类!”,听着有点怪怪的,不过好像一点都不违和呢!嗯,好吧,我承认,我这个例子非常不贴切,不过你也能看出来问题在哪里了吧
  • 有些类,尤其是父类或者基类,一旦被实例化,就会出现一些奇怪的甚至是不可预测的事情发生,如何才能让一些不能被实例化的父类不被实例化呢,抽象类就来了

2.抽象类

  • 抽象类:第一句话,它不能被实例化;第二句话,它必须被其他类扩展(抽象类的静态成员除外);
  • 第一句话是规则,编译器不会允许一个抽象类被实例化;
  • 第二句话是应用,抽象类不能被实例化,如果也不能被其它类扩展,那么抽象类,就只剩下抽象了,也就没啥存在的意义了,不过这里有一个除外的,就是抽象类里面是可以有静态成员的,也能运行一部分代码,那我写个类不好么,非要写个没有用的抽象类,总之就是抽象类不被其他类扩展的话一无是处;
  • 首先贯彻一个思想,就是确定一个类是否抽象,要看你的业务需要和代码需求
  • 最重要的一句话:抽象类就是一系列扩展抽象类的其他类的模板!!!!!
  • 记得咱们曾经说过的协议么?其实,抽象类就记录了子类的一部分公共协议;

3.我们一起来抽象(有病,象也没招你)

[1].抽象方法

  • 将方法用abstract关键字标记,这个方法就成为了抽象方法,例如:public abstract void eat();不知道你注意到了么,这个方法的结尾不是大括号,而是分号,对了,这就是抽象方法,用abstract关键字修饰,并且用分号结尾,没有方法体的方法,就是抽象方法
  • 由此也可以看出,抽象方法必须被覆盖才有意义,如果没有子类方法覆盖的话,什么用都没有,覆盖抽象方法的规则和方法重写的规则一致;

[2].为什么我们先说抽象方法呢?

  • 一个类里面如果有一个抽象方法,那么这个类必须由abstract修饰,成为抽象类;
  • 一个抽象类里面可以有抽象方法也可以有非抽象方法;
  • 由此可见,不是一个抽象类决定了方法是不是抽象的,而是一个抽象方法的存在决定了一个类是不是抽象类;
  • 还有一句话必须记住,在一个继承树中,第一个出现的具体类(第一个出现的具体类,不是第一个出现的类,因为抽象类的子类有可能也是一个抽象类),必须实现所有抽象方法(记住了,是所有!!!!);

[3].需要明确的

  • 抽象方法不能用private\final\static关键字修饰,因为抽象方法就是用来被继承,被重写的,所有阻断继承的关键字都不可以用
  • 抽象类就是继承树中创建新类的模板,主要用于继承,是为了便于扩展和维护而存在的;
public class TestOne {

	public static void main(String[] args) {
		
		Staff s1,s2;
		
		s1 = new FemaleEmployees();
		s2 = new MaleEmployees();
		
		s1.staffInfo("小张", 20, "文员");
		s2.staffInfo("小李", 30, "销售");

	}
}

abstract class Staff{
	
	static String COMPANY;
	
	String name;	
	int age;	
	String job;
	
	Staff(){
		
		COMPANY = "XX科技公司";
	}
	
	public abstract void staffInfo(String name,int age,String job);	
	
}

class FemaleEmployees extends Staff{
	
	static String GENDER;
	
	FemaleEmployees(){
		
		super();		
		GENDER = "女";
	}

	@Override
	public void staffInfo(String name,int age,String job) {
		
		super.name = name;
		super.age = age;
		super.job = job;
		
		System.out.println("姓名: " + name + ", 性别: " + GENDER + ", 年龄: " + age + ", 职位: " + job + ", 公司: " + COMPANY);
		
	}	
}

class MaleEmployees extends Staff{
	
	static String GENDER;
	
	MaleEmployees(){
		
		super();		
		GENDER = "男";
	}

	@Override
	public void staffInfo(String name,int age,String job) {
		
		super.name = name;
		super.age = age;
		super.job = job;
		
		System.out.println("姓名: " + name + ", 性别: " + GENDER + ", 年龄: " + age + ", 职位: " + job + ", 公司: " + COMPANY);
		
	}	
}

输出结果:

姓名: 小张, 性别: 女, 年龄: 20, 职位: 文员, 公司: XX科技公司
姓名: 小李, 性别: 男, 年龄: 30, 职位: 销售, 公司: XX科技公司

上面这段代码基本可以说明问题,只是非常难看而已,但是代码本来也是越写越顺的么,我有信心

4.关于Object的题外话

虽然Object是所有类的祖宗,不过Object不是抽象类,Object是可以被实例化的,不过不要因为Object可以被实例化,而轻易使用Object进行多态引用,那是非常不明智的。

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值