文章目录
今日提要:抽象类
你以为这几天看的内容都是多态?你太小看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进行多态引用,那是非常不明智的。
标签:JAVA,String,age,自学,job,抽象,日志,抽象类,name From: https://blog.csdn.net/mycqyjn/article/details/140539980