• 【Java学习笔记(一百二十六)】面向对象(一)之类与对象的构成


    本文章由公号【开发小鸽】发布!欢迎关注!!!


    老规矩–妹妹镇楼:

    一、面向对象

    (一)POP与OOP

            所谓的POP指的是:Procedure Oriented Programming(面向过程)

            所谓的OOP指的是:Object Oriented Programming(面向对象)

            面向过程,强调的是过程的功能行为,以函数为最小单位,只考虑怎样完成这个过程;

            面向对象,强调的是构建具备功能的对象,以类/对象为最小单位,考虑的是谁来完成这个过程,更加符合人类在日常生活中的思维习惯,包括抽象、分类、继承、聚合、多态等;


    (二)面向对象的三大特征

            封装、继承、多态


    二、类与对象

    (一)概述

            类是对一类事物的描述,是抽象的概念;

            对象时实际存在的每类事物的个体,因此也称为实例;

            面向对象的程序设计的重点就是类的设计;


    (二)类的成员构成

            一个类中的成员构成包括:类的成员变量、类的构造器、成员方法、代码块、内部类;
    在这里插入图片描述

            通常在定义类时,需要考虑类的修饰符、类名,如public修饰符表示公开的类,private修饰符表示私有的类。

    (三)对象

            在定义了类后,即可通过类的实例化创建类的对象,使用new来创建类的实例对象,并通过“对象名.对象成员”的方式访问对象成员,其中包括属性和方法。

            当对象生成后,如数组一样在栈空间中入栈对象的地址,而在堆空间中分配对象的内存空间,与数组的内存空间分配类似。


    (四)匿名对象

            所谓匿名对象即不定义对象的句柄,直接调用该对象的方法等,如下所示:

    new Person().eat();
    
    • 1

            这种匿名对象多用于单次方法的调用,或是作为一个实参传递给方法调用。


    (五)成员属性

    1.声明格式

            一个类中总会定义一些类的成员属性变量,用以描述该类的相关信息,在定义类的成员属性变量时,要遵循一定的规则,采用如下所示的方式定义属性变量:

    修饰符 数据类型 属性名 = 初始化值;
    
    • 1

    2.修饰符

            其中,初始化值可以省略不写。常见的修饰符包括权限修饰符,如private、缺省、protected、public;以及其他修饰符,如static、final等。权限修饰符能够限制该成员属性变量在各个类中的可见性,有效地保护类中的数据信息。

    public class Person{
    	private int age; // 声明private变量 age
    	public String name =Lila; //声明public变量 name
    }
    
    • 1
    • 2
    • 3
    • 4

    3.属性变量的分类

            对于类中的属性变量,有多种的分类方式,也会产生多种变量名称,这些我们都需要牢记于心。首先从整体上看,变量一定不会脱离类而独立存在,在类中变量分为成员变量与局部变量。所谓的成员变量指的是在类体内直接声明的变量,而局部变量则包括在方法、构造器内定义的形参,方法内定义的变量以及代码块内定义的变量。

            对于类中的成员变量又分为实例变量与类变量,所谓的实例变量指的是不用static修饰的变量, 即不是static静态变量,只能通过对象进行访问;而类变量,即使用static进行修饰,可以直接通过类名进行访问。以下是成员变量与局部变量之间的差别:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cj5x7Bx-1659007982949)(C:\Users\Mr.wmxx\AppData\Roaming\Typora\typora-user-images\image-20220727164624000.png)]

    (六)成员方法

            类中的方法时类或对象行为的抽象,用以完成某个功能,因此将该种功能封装为一个可以重复调用的方法。

    1.声明格式

            成员方法的声明格式如下所示,与普通方法类似:

    修饰符  返回值类型  方法名 ( 参数类型 形参1,  参数类型 形参2,. ){
    	方法体程序代码
    	return  返回值;
    • 1
    • 2
    • 3
    • 4

            其中修饰符也包括权限修饰符、static、final等,要注意的是return在无返回值时也可以使用表示结束方法,在return之后就不能写任何的表达式了。其余格式较为简单,因此无需进行描述。

    2.方法重载

            在一个类中,可以声明多个同名方法,但也需要保证这些方法的参数格式或者参数类型不相同,注意方法的重载与方法的返回值类型无关,只关注参数列表的不同。如下所示:

    //返回两个整数的和
    int add(int x,int y){return x+y;}
    //返回三个整数的和
    int add(int x,int y,int z){return x+y+z;}
    
    • 1
    • 2
    • 3
    • 4

            我们最常用的输出语句System.out.println()就是典型的重载方法,如下所示:

    public void println(byte x)
    public void println(short x)
    public void println(int x)
    
    • 1
    • 2
    • 3

            注意,当两个方法的参数列表中的多个参数类型相同,但是相同类型的形参位置不同时,也会构成方法的重载,如下所示:

    void show(int x,char y,double z){}
    int show(int a,double c,char b){}
    
    • 1
    • 2

    3.可变个数的形参

            从JDK5.0开始提供了Varargs机制,允许直接定义能和多个实参相匹配的形参,来更加简单地传递个数可变的实参。如下所示,同时传入多个同一类型的变量:

    //JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
    public static void test(int a ,String[] books);
    //JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
    public static void test(int a ,String…books);
    
    • 1
    • 2
    • 3
    • 4

            可以看到的是,数组也可以发挥同样的作用,其实可变形参就是传入了一个数组形参,因此数组形参与可变形参之间是不能重载的!!!

            同时要注意的是,当方法的参数中存在可变形参时,需要将可变形参放在形参声明的最后位置,不然的话由于可变形参的数量是不确定的,编译器难以区分!在一个方法的形参位置,最多只能声明一个可变形参。

    4.方法参数的值传递

            Java中方法的参数传递方式为值传递,即将实际参数值的副本传给形参,对于形参是基本数据类型的,将实参基本数据类型变量的“数据值”传递给形参;对于形参是引用数据类型的,将实参引用数据类型变量的“地址值”传递给形参。

    (七)构造器

            构造器的作用是创建对象,为对象进行初始化,它具有与类相同的名称,且不声明返回值类型,不能被static、final、synchronized、abstract、native等修饰符修饰,不能带有return语句返回值。

    1.语法格式

    修饰符 类名 (参数列表) {
    	初始化语句;
    }
    
    • 1
    • 2
    • 3

            构造器与当前类的名称相同,修饰符可以采用常见的权限修饰符,如下所示:

    public class Animal{private int age;public Animal(){
    
    ​		ages = 4;}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.构造器注意事项

            在每个Java类中,至少都有一个构造器。构造器一般分为两类,一类是默认提供的隐式无参构造器,即使我们不显式定义类的构造器也会存在一个隐式的无参构造器,该默认构造器的修饰符与所属类的修饰符是一致的;另一类是显式定义的构造器,可以是有参或是无参的,一旦显式定义了构造器,则默认的无参构造器是不会提供的,需要显式地定义一个无参构造器

            每个类中可以重载多个有参构造器,可以供多种方式初始化类的对象,方便创建各种不同的对象,同时需要注意的是,子类是不能继承父类的构造器的,但可以调用父类的构造器方法。

            构造器的修饰符与所属类的修饰符是一致的**;另一类是显式定义的构造器,可以是有参或是无参的,一旦显式定义了构造器,则默认的无参构造器是不会提供的,需要显式地定义一个无参构造器

            每个类中可以重载多个有参构造器,可以供多种方式初始化类的对象,方便创建各种不同的对象,同时需要注意的是,子类是不能继承父类的构造器的,但可以调用父类的构造器方法。

  • 相关阅读:
    Redis 主从复制
    【AI视野·今日NLP 自然语言处理论文速览 第六十二期】Wed, 25 Oct 2023
    MySQL索引详解
    netty系列之:Bootstrap,ServerBootstrap和netty中的实现
    三十四、java版 SpringCloud分布式微服务云架构之Java Iterator(迭代器)
    java基础—String
    JSON数据格式
    Unity VideoPlayer使用url方式,Android平台下无法播放http链接的视频(黑屏、无反应、无报错、无log输出)...
    vue路由传参刷新丢失
    JTS:04 读取数据库数据
  • 原文地址:https://blog.csdn.net/Mrwxxxx/article/details/126042304