javaSE之面向对象

本文深入探讨Java面向对象编程的核心理念,包括封装、继承、抽象、接口和多态的运用,以及它们如何简化代码,提高复用性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象

思维导向图 

心得体会 

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的关系么。那么这句话的俗语表示就是小米手机是手机,这样很符合汉语规范,我相当于用一个大的东西接受了一个小的东西。那么在请看这个代码

奇怪他为什么会报错呢,那么我们在翻译一下,手机是小米手机,很显然这样就不对了,我们只能把抽象的东西说的具体一点,没办法把具体的东西说的抽象。做人如此,代码也要如此。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值