(6)当一个抽象类 继承一个抽象类的时候,可以不用来重写 当作父类的那个抽象类的抽象方法:提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、抽象类的概念
二、抽象类的语法
三、抽象类的特性
四、抽象类的理解
五、总结一下抽象类所需要的注意点
总结
前言
今天我们将进入到Java中有关抽象类的概念,抽象类是属于类的一种,在Java中有着非常重要的作用,今天就让我们通过一篇文章走进抽象类的时间;
一、抽象类的概念
在面向对象的概念中,所有的对象都是通过 类 来描绘的;
但是,并不是所有的类 都是用来描述对象的;
概 念 : 如果一个类中 没有包含足够的信息 来描绘一个具体的对象,那么 这样的类 我们就把它叫做 抽象类。
比如:
二、抽象类的语法
在Java中, 一个类如果被 关键字abstract 修饰,则称这个类为 抽象类;
抽象类中 被 abstract 修饰的方法称为 抽象方法,抽象方法不需要给出具体的方法体;
代码语法:
//Shape类 称为抽象类
abstract class Shape {
public abstract void draw(); //draw方法 称为抽象方法
}
【注意】抽象类也是类,里面可以包含 成员变量和成员方法,甚至构造方法。
三、抽象类的特性
(1)抽象类 不能实例化对象(指的是不能实例化自己的对象)
解释:
这个很容易理解:因为从抽象类的概念 我们可以得知,抽象类 不可以完整的描述 一个对象;那么当然不可以实例化对象了。
如果实例化的不是自己的对象,那么可以去实例化(不可以实例化张三的对象,关于我李四什么事......):
(2)abstract修饰的 抽象方法 不能被final修饰,因为被abstract修饰的方法必须要重写,被final和static修饰的方法必须不能重写;当然,final也不可以修饰抽象类;它们是天敌,咋可能出现在一起嘛:
(3)抽象方法不可以被static修饰 (这个是重写的规则):
(4)抽象方法是不可以用private修饰的:
【注意】如果抽象方法没有加 访问修饰限定符时,默认是public。
(5)抽象类当中不一定有抽象方法,但是如果这个方法是抽象方法,那么这个类一定是抽象类:
但反过来,有抽象方法的类 一定是抽象类,这个是毫无疑问的。
(6)当一个抽象类 继承一个抽象类的时候,可以不用来重写 当作父类的那个抽象类的抽象方法:
那么,有没有一种无限套娃的可能;
要记住,“出来混,迟早要还的”;
四、抽象类的理解
有的人就可能会特别的迷糊:
别人告诉他,一个类,居然不可以实例化对象,那么这个类 还有什么意义呢 ?
给大家看一段代码:
有的人可能会疑问:
这个抽象类 怎么看起来和普通类 没有什么区别呢?都有成员变量和成员方法啊!
其实,这些人说的没错;
确实抽象类和普通类基本上没有什么区别;
唯一的区别就是:抽象类 多了一个抽象方法,让这个类同时被abstract修饰,使得这个类不可以被实例化了;其他 在里面定义 成员变量、成员方法啥的 都和普通类一样。
那么,回到最初的问题,抽象类 居然不可以被实例化,那么它存在的意义是什么呢?
其实,抽象类 存在的最大意义是:为了被继承;
当然,这个继承是有条件的:
如果一个普通的类Cycle 继承了 抽象类Shape 之后,此时 必须得要重写 抽象类Shape 当中的所有的抽象方法(下面我只举了一个 只有一个抽象方法的例子):
既然 抽象类的出现是 为了被继承,那么抽象类肯定是父类,
即 可以引用所有继承它的子类对象;也就是说,抽象类也可以发生向上转型,进一步发生多态:
代码分析:package Demo1; //Shape类 称为抽象类 abstract class Shape { public String name; public int age; public void eat() { System.out.println("吃饭!!!!!!"); } public void sleep() { System.out.println("睡觉!!!!!!"); } //draw方法 称为抽象方法 public abstract void draw(); } class Cycle extends Shape { @Override public void draw() { System.out.println("○"); } } class Rect extends Shape { @Override public void draw() { System.out.println(" ⃟ "); } } class Triangle extends Shape { @Override public void draw() { System.out.println("△"); } } class Flower extends Shape { @Override public void draw() { System.out.println("✿"); } } public class TestDemo1 { public static void drawMap(Shape shape) { shape.draw(); } public static void main(String[] args) { Cycle cycle = new Cycle(); Rect rect = new Rect(); Triangle triangle = new Triangle(); drawMap(cycle); drawMap(rect); drawMap(triangle); drawMap(new Flower()); } }
代码示例结果:
五、总结一下抽象类所需要的注意点
总结
今天有关抽象类的学习就到这里了,今天我们也将结束Javase的学习,接下来就让我进入到Javases的学习当中吧!!!!!!!!!我们下个内容再见哦!!!!