面向对象
思维导向图
心得体会
java语言开发是面向对象的,它不关心具体的底层实现。之前学C语言,要给一个数组排序,我们首先就要考虑用什么排序,什么排序效率高,如何实现这种排序等等的底层算法。而现在学了面向对象的java语言,我们应该考虑的是java底层为我们封装好了什么方法可以进行数组排序,事实上只需要仔细查阅一下API文档,这个问题便迎刃而解。例如Arrays类中提供了一个sort()方法,只需要调用一下他,数组就会自动升序排列。
培养面向对象思想,遇到问题的时候,应该考虑的是java给我们提供了什么类,这个类中有什么方法可以实现这个问题,或者几种方法的组合可以实现我们的需求。当这个问题解决了,我们就应该自己将这一系列方法再次进行封装,以便下次需要类似的问题,便无需多想直接调用就好了。
之前,我们定义好一个java文件,每次加新的东西,要么重新定义一个新类,要么直接在以前的类上面做修改,每次创建新类,都需要重新写好多东西,这样不仅费时间,而且代码看起来特别的凌乱。而且这些代码的重复性特别高,真的很心累。但是通过后面接触到继承以后,我发现有些通用的属性和方法,我们可以单独抽出来写一个专门的类,标准把他叫做父类或者超类,以后需要用这些属性和方法,我只要让目前的类继承超类或者父类,继承关键字(extends),当前的类就拥有了父类的全部属性和方法(除了父类中私有的方法,既然人家不想让我用,那我就不用也罢)。轻松解决,妈妈再也不用担心我的学习。
随着继续深入,逐渐发现,有些方法根本不用在我们的超类中直接实现,因为百分之百子类是需要重写的,那么在父类中直接定义岂不是很浪费时间多此一举,于是一个新的概念抽象就被引出来了, 这里的抽象不是抽象封装的那个抽象,而是abstract,抽象方法,抽象类。请看下面这个抽象类。
//用abstract修饰抽象类和抽象方法
public abstract class chouxianglei {
//抽象方法不需要方法体
public abstract void chouxiangfangfa();
//抽象类中也可也定义非抽象方法
public static void a(){
//Todo...
//静态方法
}
public void b(){
//这是非静态的
}
}
注意抽象类可以不定义抽象方法,但是抽象方法必须存在于抽象类中。
有了抽象类,我们只关心某事物有哪些共有的特征, 我们需要哪些共有的功能,而不用把其实现交给父抽象类,具体实现只需要继承的时候重写就好了。
这下子又有新的需求了,如果我们需要扩展一些功能,例如给手机加一个编程功能,我们到底是要写在哪个类当中呢?如果放在抽象类手机中,那就意味着全世界所有的手机都具有编程这个功能,显然不符合现实,那我们应该定义到具体的手机类么,比如我定义给小米手机,赋予它编程的能力,那万一苹果手机也需要编程功能,我是不是还需要在给苹果手机加一个,万一三星也要呢,oppo也要呢。显然这样的做法又回到以前了,那怎么解决呢?
于是创造java大牛们就给我们提供了一个新的设计理念----接口。它很类似于一个抽象类,但是区别很大,接口中是定义一些扩展功能的,而抽象类是封装一些共同的功能。这样我们就可以把这个编程的扩展功能定义在一个接口中,谁需要,谁实现即可。这里有个关键字实现(implements),补充一个知识点:无论是抽象类还是接口,都不能直接new出对象,抽象类我们可以通过子类继承他并得到它的东西,接口就靠实现它获得它的东西。
//通过interface 定义一个接口
public interface PhoneInterface {
//public abstract是默认可也不写,但是建议写上
//定义一个抽象方法编程
public abstract void programme();
//接口中不能有具有方法体的方法,出了default修饰
default void say(){
//具有方法体的方法
}
}
class XiaoMiPhone implements PhoneInterface{
//只要实现接口,接口中抽象方法全部是强制重写的,不重写就报错
@Override
public void programme() {
//todo
}
}
java是面向对象,面向对象强调万事万物皆对象 ,那么每个事物在不同时刻总会表现出不同的状态,这个多种状态其实抽象到java设计思想就是多态的思想。所谓多态就是一个事物不同时刻的表现情况,在专业一点就是父类引用指向子类对象,注意这句话中,既然有父子类那么肯定就需要有继承关系,除了这个还要求必须有方法的重写,这两点就是多态的前提。这样说或许还比较抽象,我继续拿手机来总结,那么请看一段代码。
public class Phone {
String band;
String color;
int price;
public void call(){
//....
}
}
class XiaoMiPhone1 extends Phone{
@Override
public void call() {
//...
}
}
class test1 {
public static void main(String[] args) {
//多态创建对象
Phone phone = new XiaoMiPhone1();
}
主要来看main方法中,我首先创建了一个Phone对象,但是我new的却是一个Phone的子类,这是怎么实现的呢,还记得继承的是一种is a的关系么。那么这句话的俗语表示就是小米手机是手机,这样很符合汉语规范,我相当于用一个大的东西接受了一个小的东西。那么在请看这个代码
奇怪他为什么会报错呢,那么我们在翻译一下,手机是小米手机,很显然这样就不对了,我们只能把抽象的东西说的具体一点,没办法把具体的东西说的抽象。做人如此,代码也要如此。