概念:
抽象性和具体性都是相对的,不是绝对的。简单来说,概念的内涵越小,则其抽象的程度就越高,其外延也越大,反之亦然。比如“人”比“男人”抽象一点,而“生物”又比“人”抽象一点,“物质”则比“生物”更抽象。 抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排除,集中描述其共性,就会产生一个抽象性的概念。抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们再学习代词“你,我,他”时往往遇到困难,因为代词具有较高的抽象性。。 总之,抽象概念外延大,内涵小;具体概念内涵大,外延小。
一、抽象类和普通类的区别:
- 普通类可以去实例化调用;抽象类不能被实例化,因为他是存在于一种概念而并非具体。
- 抽象类可以有构造函数,被继承时子类必须继承父类的一个构造方法,抽象方法不能被声明为静态 (抽象类时可以有构造方法的,抽象类的构造方法用来初始化抽象类的一些字段,而这个一切都在抽象类的派生类实例化之前发生的。不仅如此,抽象类的构造函数还有一种巧妙应用:就是在内部实现子类必须执行的代码~)
- 抽象方法只需要声明,无需实现,抽象类中可以允许普通方法有主体
- 含有抽象方法的类必须声明为抽象类
- 抽象类的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
- 普通类和抽象类都可以被继承,但是抽象类被继承后的子类必须重写继承方法,除非自己也是抽象类,下面是一个实例:
// 这是宠物类,普通父类,方法里面是空的
public class Pet{
public void play() {
}
}
// 猫类,重写父类的方法
class Cat extends Pet {
public void play() {
System.out.println("1");
}
}
// 狗类,重写父类的方法
class Dog extends Pet {
public void play() {
System.out.println("2");
}
}
// 测试类,分别调用了子类的不同方法
class Test {
public static void main(String[] args) {
// 体现了多态
Pet p1 = new Dog();
Pet p2 = new Cat();
p1.play();// 输出 2
p2.play();// 输出 1
}
}
问题:如果把父类 Pet 改为抽象类,方法改为抽象方法,那么,public void play(); // 抽象方法没方法体 子类不变,依然重写父类方法,那这个跟普通父类没区别啊? 难道说就一个抽象方法没方法体就完事了??那我普通方法有方法体,我空着不写内容就得了,不跟抽象方法一个样嘛? 别跟我说抽象类还不能实例化,哥也不需要去new它! 普通类能搞定的,还弄个抽象类有什么意义?我前面说了,普通类的方法我可以空着不写,达到和抽象类方法没方法体一样的效果。 既然两种方式都能打到同一个输出效果,弄一种方式不就得了,那为什么还要创造出一个抽象类出来?难道是比普通类看着舒服?用着爽?还是更加便捷?还说为了强制让别人用的时候必须强制话实现抽象方法省的你忘了什么的? 答:就是为了强制不能实例化,以及强制子类必须实现方法,这不是你忘不忘的事情,你说你不去new它就行了,这话没错,那你想另一个问题,为什么要有访问控制?为什么要有public 和 private 之分呢? 我可以全部public 不该访问的我不去访问就行了啊 小程序里,看不出什么区别,反而private 成员要写一大堆的set 和get方法,多麻烦。 但是项目大了,代码多了,这种严谨的结构就很重要了 且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去 面向对象说到底就是方便你思考,模块化,易维护管理,硬说没有必要,整个面向对象都没有必要了,C语言有什么干不了的啊,运行效率还高。
二、抽象类和接口的区别
- 概念不一样,接口是对动作的抽象,抽象类是对本质的抽象
抽象类表示的是,这个对象是什么,而接口表示的是,这个对象能做什么。比如,男人,女人,这两个类,他们的抽象类是人,说明他们都是人。人可以吃东西,狗也可以吃东西,你可以把吃东西定义成一个接口,然后让这些类去实现它。 所以再高级语言上,一个类只能集成一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)
- 使用不一样
a. 抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高 b. 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量 c. 抽象类主要用来抽象类别,接口主要用来抽象功能 d. 抽象类中,且不包含任何实现,派生类必须覆盖他们。接口中的所有方法都必须是未实现的。 e. 接口是设计的结果,抽象类是重构的结果
- 使用方向
当你关注一个实物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。注意:抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。