您的位置:首页 > 汽车 > 时评 > JAVA零基础小白自学日志——第二十天

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

2024/9/8 10:48:05 来源:https://blog.csdn.net/mycqyjn/article/details/140539980  浏览:    关键词:JAVA零基础小白自学日志——第二十天

文章目录

  • 1.为什么我们需要抽象类
  • 2.抽象类
  • 3.我们一起来抽象(有病,象也没招你)
    • [1].抽象方法
    • [2].为什么我们先说抽象方法呢?
    • [3].需要明确的
  • 4.关于Object的题外话

今日提要:抽象类
你以为这几天看的内容都是多态?你太小看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 = "女";}@Overridepublic 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 = "男";}@Overridepublic 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进行多态引用,那是非常不明智的。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com