JavaSE基础(七)——面向对象编程

JavaSE基础(七)——面向对象编程

总结一定要看,谢谢!

前言

在Java编程中,最基础、最核心的便是面向对象编程(OOP),面向对象编程是一种思想,它不单单存在于JAVA语言中,其实很多语言都可以面向对象编程。

严格来说,对象是一个概念,面向对象编程就是一种抽象与具象化(实例化)的思想。我们所熟知的面向过程的语言其实也可以做面向对象的编程(只了解概念的同学别杠)。

面向对象是很重要的思想,可以多看一些相关的博客,这个思想急不得,慢慢来,但是一定要透彻。

面向对象思想

面向对象的思想可以理解为:以对象为单位,对象是一个宏观概念的实例化。首先说明一下抽象和具体的概念:

  • 抽象:世间万物皆有一些独一无二或者能代表它基本特性的特征,将这些特征抽取出来有人类可以理解的语言加以描述,这种描述可以表述出大量符合描述的存在;
  • 具体:我们将上面抽象出来的概念中描述的特性加以定性说明(指定特征的实际描述),这样从宏观不定性的存在变成了确定的一种存在。

上述描述可能不是很好理解。可以看下面通俗讲解:

  • 抽象:车,别管啥车,就是车,几个轱辘都算。
  • 具体:规定了动力,车轮数,载客数等具体的一些描述,我们就可以得知是自行车、电动车还是其他种类车辆。

我们所谓的面向对象编程的思想其实就是以对象为单位对程序进行设计,当然对象内部还是需要我们来操作,即对象内部还是以面向过程的方式来操作。

所以,面向对象的思维也可以理解为面向过程的抽象,我们把一些固定的或者一类问题的处理过程抽象出来,封装成一个对象。上面说的每一句话基本都离不开一个概念——抽象。

在此提醒各位,面向对象编程有三大特性:封装、继承、多态(有些书籍也会加上抽象),而我个人认为,抽象是面向最重要的核心,封装、继承以及多态都是基于抽象这个概念衍生出来的产品。(个人想法,不同意的可以探讨,别喷别骂,理性交流)。

面向对象编程(官方)

  • 面向对象的本质:以类的方式组织代码,以对象的组织(封装)数据。

  • 三大特性:

    • 封装:封装就是将我们上面说的一些数据、描述封装成一个整体,留出一个访问接口;
    • 继承:和人类继承遗产差不多,一个类可以和另一个类建立父子关系(认个父亲),可以从父亲手里继承资产,即父亲有啥儿子就有啥;
    • 多态:顾名思义,多种状态。根据不同的对象或权限等,每一种存在在执行同一种行为的时候可能存在不一样的结果;比如:
  • 从认识论角度来讲:先有对象后有类。因为一种存在的抽象描述必须建立在该存在实际存在的时候(比较拗口),类作为抽象的描述应该建立在实际存在的对象之后(别和我说科学界的猜想和假设,那种是假设他们想要研究的物体客观存在,实际上存不存在他们也不知道);

  • 从代码运行角度考虑是先有类后有对象,因为在运行过程中,有类的存在才能实例化对象。

对象

类与对象

之前说过堆、栈以及方法区的概念,现在我们来实际操作一下类和对象:

// 创建一个Student类
public class Student{
    
    public static void main(String[] args){
        // 实例化Student类的对象
        Student student = new Student();
    }
    
}
  • 我们在之前书写Java代码的时候,都会先在项目中创建一个Java类,然后在类中书写代码。刚才我们说过类是一系列客观存在的宏观描述,所以我们可以对这个类进行一个具体实例化的操作,这个实例化就是所谓的对象

  • 我们创建对象的操作就如上面的代码所表示的,对象是new出来的。new这个关键字可以理解为在堆内存中开辟一个空间,这个空间是存放当前类实例化对象的;同时我们前面定义的Student类型的变量就是该对象的引用——这个问题依旧请大家移步到我的另一篇博客中学习;

    《第一章 Java类和对象(一)》

  • 对象的引用是存放在栈内存中,而实际的对象是赋值标识符后面的那个表达式,它是存放在堆内存中;

类中的方法

上面说完了实例化对象的操作,下面来说一下方法在类中的不同表现形式:

public class Student{
    // 被static修饰的是静态类,属于类独有的,不属于对象
    public static void study(){
        // 静态方法是和类一起加载的,只要程序启动就会加载这个方法
    }
    
    // 没有static修饰的方法是普通方法
    public void play(){
        // 普通方法是属于对象的,程序运行的时候,如果没有实例化对象,该方法就不会被加载;该类被实例化后该方法才会存在。
    }
}
  • 静态类中不能直接调用非静态方法,可以通过实例化的对象调用非静态方法或者直接使用类来调用;
public class Student{
    public static void study(){
    }
    
    public String play(){
        return "我在玩";
    }
    public static void main(){
        Student student = new Student();
        // 类名调用
        System.out.println(Student.play());
        // 对象向调用
        String result = student.play();
        System.out.println(result);
    }
}
  • 之前说过Java中只有值传递,其实我们也拥有引用传递,只是引用传递的本质依旧是值传递,但是又略有不同;对象在传递的过程中可以理解为C语言的指针的传递,我们将对象的引用传递过去,在被调用的方法中使用同类型对象的引用接收一下,就变成了:同类型引用——》对象的引用——》真实对象。这个样子我们在修改的时候实际操作的还是同一个对象,所以我们在传递对象的时候会与普通的值传递不太一样;

对象的相关

之前说过类是客观存在的宏观描述,所以类中一定有对于描述的一些特征定义,这个就是类中的成员变量。如下:

public class Student(){
    String name;
    String id;    
}
  • 比如描述学生的话可以通过姓名、学号来描述学生,姓名和学号就是类中的成员变量;
  • 每实例化一个成员变量都会开辟出对应的空间来存储这两个成员变量的数据,即使不赋值也会给留出空间,值为默认值null;

我们在实例化对象的时候,除了分配对象的空间外还会给已经创建好的对象进行默认的初始化操作以及对构造器的调用,首先来看一下构造器的写法:

public class Student{
    String name;
    
    public Student(){
        
    }
    
    public Student(String name){
        this.name = name;
    }
}
  • 构造器也是一个方法,他的修饰符一般来说都是public(修饰符的种类以及代表的含义后续讲解);

  • 构造器的方法名必须与类同名;

  • 构造器没有返回值类型,也不能写void;

  • 构造器分为有参构造器和无参构造器;

  • 无参构造器是给对象进行默认初始化(即对象的成员变量按照数据类型进行默认赋值);

  • 有参构造器是可以对对象的成员变量进行传参赋值;

  • 类中可以不写构造器的时候,系统默认会隐式的提供一个无参构造器;我们也可以选择自己写无参构造器,这样会覆盖系统提供的那个;

  • 【注】:每个类必须有无参构造器,如果我们手写了有参构造器就会把系统的无参构造器覆盖掉;所以手写有参构造器后就必须手写无参构造器;个人建议每个类都自己手写构造器;

  • 有参构造器可以有多个,也可以不对所有成员变量进行赋值。

  • Java中的构造器其实就是C++中的构造函数,作用相同。

当我们实例化对象时,使用new关键字时会调用构造器来对申请完空间的对象进行初始化赋值的操作。具体调用那个构造器取决于实例化对象的时候是否传递参数已经传递参数符合那个有参构造器。

public class Student{
    String name;
    String id;
    
    public Student(){  }
    
    public Student(String name){
        this.name = name;
    }
    
    public Student(String name,String id){
        this,name = name;
        this.id = id;
    }
    
    public static void main(String[] args){
        // 调用无参构造器
        Student stu1 = new Student();
        // 调用一个参数的有参构造器
        Student stu2 = new Student("Reman");
        // 调用两个参数的有参构造器
        Student stu3 = new Student("Reman","1001");
    }   
}

上述代码中有一个大家陌生的存在——this,这是一个JAVA语言中的关键字,具体含义如下:

  • 表示当前对象的引用;
  • 在传递对象的引用或者在构造器内部时会自动的指向当前执行操作的对象;

总结

本篇笔记记录的东西很复杂,涉及到比较深层次的东西,我在学习或者指导小白学习的过程中,他们普遍反应没有基础的人听得很懵,我的笔记可能适合有基础的。

对此我只想说,没有什么是简单的,一学就会的玩意为什么还有那么多人想靠这个吃饭?自己坚持吧,我只能说我记录的东西比当初老师教的要详细一些、通俗一些。如果学不懂还在抱怨我记录的太难,请出门左转,另谋高就,我没时间和你们打嘴仗。我的资源全都是免费的,分文不取,白嫖还觉得吃亏的话,求您别看,谢谢!

其余同学,如果觉得有帮助的话我很开心,大家一起努力,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值