首页 > 编程语言 >JAVA零基础小白自学日志——第二十天

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

时间:2024-07-20 20:00:14浏览次数:14  
标签:JAVA String age 自学 job 抽象 日志 抽象类 name

文章目录


今日提要:抽象类
你以为这几天看的内容都是多态?你太小看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

相关文章

  • Java学习路线图-进阶版
    好看的皮囊千篇一律、有趣的灵魂万里挑一文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。还有机会获得内推名额。文章目录一、Java基础二、MyS......
  • JAVA零基础小白自学日志——第十九天
    文章目录1.private(私有)2.static(静态)3.final(最终)[1].fianl修饰变量[2].fianl修饰方法[3].fianl修饰类[4].为什么需要fianl关键字修饰类和方法4.private\static\final的共同点5.同名变量6.方法重载和方法重写今日提要:private\static\final修饰词;同名变量;方法重载和方法......
  • java2
    7.15-7.161.完成了PTA上的函数题和两道编程题,期间遇到了一些不懂得知识,学习了链表相关的知识,以及希尔排序算法,并复习了二分查找算法;同时也遇到了一些比较复杂的题目,通过在网上观看题目解析后有了思路并成功写出来,也出现过许多细节上的错误,这也使我更加认真思考每一处问题2.观看......
  • Java 代理模式详解
    Java代理模式详解1.代理模式代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(realobject)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。代理模式的主要作用是扩展目标对象的功能,比如说在目......
  • Java之线程池
    一、什么是线程池,为什么使用线程池?线程池其实是一种池化的技术的实现,实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务线程池的优点:降低资源消耗。通过......
  • Java中的Heap(堆)(如果想知道Java中有关堆的知识点,那么只看这一篇就足够了!)
        前言:(Heap)是一种特殊的完全二叉树,它在诸多算法中有着广泛的应用,本文将详细介绍Java中的堆。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客先让我们看一下本文大致的讲解内容:目录1.堆的初识       ......
  • 自学Java第三周
    本周学习一、循环1.while循环先判断条件,符合再执行。while(){}2.dowhile循环先执行一次,再判断条件。do{}while();3.forfor(初始条件;判断条件;循环迭代语句){}4.嵌套循环各种类型的循环都可以做内外侧循环。for(){for(){......;}}for(){while(){......;}}...5.控制循环结构break:完全结束一个循环,跳出循环体。continue:结束本次循环,开始下次循......
  • Java--抽象类
    目录抽象类的概念抽象类的语法抽象类的作用抽象类的概念在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。我们之前所学习的Animal类或者Shape类,就可......
  • java进阶(面向对象实例代码)
    1.抽象类和接口抽象类示例abstractclassAnimal{abstractvoidmakeSound();voidsleep(){System.out.println("Sleeping...");}}classDogextendsAnimal{@OverridevoidmakeSound(){System.out.println("Bark&......
  • 类明显存在却报 package not found, Java程序中专门被其他工程所依赖的common jar用sp
    先上官方链接:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/maven-plugin/examples/repackage-classifier.html在使用SpringBoot构建通用JAR库时,尤其是当通springboot默认的过spring-boot-maven-plugin插件打包时。如果遇到了类存在但报“packagenotfound......