Java:类与对象

面向对象过程与面向对象思想

面向过程

面向过程,其实就是面向着具体的每一个步骤和过程,就是面对具体的每一个功能函数
这里是引用

面向过程也是解决问题的一种思想,当我们在解决问题时,会按照预先设定的想法和步骤,一步一步去实现,而具体的每一步都需要我们去实现和操作。而在上述描述的每一个具体步骤中,我们都是参与者,并且需要面对具体的每一个步骤和过程

面向对象

面向对象是基于面向过程,对象是将功能进行了封装
只要找到了具体的类,创建出对象,就可以调用其中的具体功能`

当不再面对具体的每一个方法时,发现操作也变的简单了很多。而封装具体功能的这类,是我们需要面对的。当面向封装了具体功能类,若要使用这个类,一般情况下,在Java中需要通过创建这个类的实体来使用。这个实体称之为对象。在开发中,我们是在不断的找封装不同功能的类,基于这些类,创建其对象,调用对象中的具体功能,使用这些对象完成相应的操作;如果真的没有能够完成需求的对象,这时就自己创建对象,并将所需的功能定义到对象中,方便以后使用
面向对象也是用来解决问题的一种思维模式,在面向对象中,我们是指挥者

面向对象和面向过程差异

面向过程是面向对象的基础

  • 面向对象是一种符合人们思考习惯的思想
  • 面向过程中更多的体现是执行者,面向对象中更多的体现是指挥者
  • 面向对象可以将复杂的问题进行简单化

类与对象的关系

对象的定义

面向对象程序设计就是使用对象进行程序设计。对象代表现实世界中可以明确标识的一个实体。每个对象都有自己独特的标识、状态和行为

对象的属性:就是对象的相关参数,一个对象的状态(也称为特征或者属性)是由具有当前值的数据域来表示的。例如:圆对象具有一个数据域radius,它是标识圆的属性。我们一般把对象的特有属性称之为成员变量
对象的行为:一个对象的行为是由方法定义的。调用对象的一个方法,就是要求对象完成一个动作。我们一般把对象的行为称之为成员函数

类的定义

类是那些具有相同属性特征和行为的对象们的统称;对象就是该类描述下具体存在的一个事物

类是用于描述现实事物的。它将现实事物进行抽象化,模板化描述;将事物的特点属性和行为封装在其中
一个对象是类的一个实例,可以从一个类中创建多个实例
在这里插入图片描述

封装与private关键字

常见的封装体现

  • 函数

封装的好处

  • 提高了代码的复用性
  • 隐藏了实现细节(不需要被外界获知的内容),还要对外提供可以访问的方式,便于调用者的使用
  • 提高了安全性
  • 它也是面向对象思想的特征之一。面向对象共有三个特征:封装,继承,多态

private关键字

  • 属于权限关键字( public 、protected、 默认不写、 private )
  • private可以作用在对象属性和行为上,外界在创建对象后,则不能访问被private修饰的内容

总结:

  • 类中不需要对外界提供的内容,最好都私有化
  • 如果后续真的需要对私有的内容进行更改,最好加上setXXX(修改器),(getXXX)访问器
注意:私有仅仅是封装的体现形式而已

不可变对象或类

通常,创建一个对象后,它的内容是允许之后改变的。有时候也需要创建一个一旦创建其内容就不能再改变的对象。我们称这种对象为一个不可变对象,而它的类就称为不可变类。如果一个类是不可变的,那么它的所有数据域必须都是私有的,而且没有对任何一个数据域提供公共的set方法。一个类的所有数据都是私有的且没有修改器并不意味着它一定是不可变类

要使一个类称为不可变的,它必须满足下面的要求:

  • 就是指其内部的数据都是私有的,没有向外界提供任何修改内部的方法(String)
  • 所有的数据都是私有的
  • 没有修改器的方法

局部变量与成员变量

区别

  • 定义的位置不同
  • 成员变量定义在类中,在函数外定义
  • 局部变量定义在方法中或者语句里面,在函数内定义
  • 在内存中的位置不同
  • 成员变量在堆内存中对象所属空间里
  • 局部变量在栈内存中函数所属空间里
  • 声明周期不同
  • 成员变量随着对象的创建而创建,随着对象的消亡而消失
  • 局部变量随着函数的进栈而创建,随着函数的出栈而消失
  • 初始化不同
  • 成员变量因为在堆内存中,有默认的初始化值
  • 局部变量没有默认的初始化值,必须手动的给其赋值才可以使用(初始化后再调用)

构造函数

构造函数的定义

构造函数主要是在创建对象的时候执行的函数,在该函数中也可对成员变量进行一些操作

构造函数的格式

权限修饰符 类名(参数列表) { 
    构造函数的代码块 
}

构造函数的特点

  • 构造函数没有返回值(因为其是为构建对象的,对象创建完,函数就执行结束)
  • 构造函数名称必须和类型保持一致
  • 参数列表可选的,构造函数是可以重载的
  • 虽然构造函数没有返回值,还是存在return关键字的
  • 当我们的类中没有定义任何构造函数时,会有一个默认隐藏的无参构造函数存在
  • 构造函数和成员函数一样,为了区分对象的调用,构造函数自带this关键字数据

默认构造函数和细节

  • 在没有学习构造函数之前,也可以通过new关键字创建对象,并调用相应的方法,同时在描述事物时也没有写构造函数。这是为什么呢?

在之前学习的过程中,描述事物时,并没有显示指定构造函数,当在编译Java文件时,编译器会自动给class文件中添加默认的构造函数。如果在描述事物时,显示指定了构造函数,当在编译Java源文件时,编译器就不会再给class文件中添加默认构造函数

  • 当在描述事物时,要不要在类中写构造函数呢?

这时要根据描述事物的特点来确定,当描述的事物在创建其对象时就要明确属性的值,这时就需要在定义类的时候书写带参数的构造函数。若创建对象时不需要明确具体的数据,这时可以不用书写构造函数(不书写也有默认的构造函数)

构造函数的细节

  • 一个类中可以有多个构造函数,多个构造函数是以重载的形式存在的。
  • 构造函数中也是有return语句的,用于结束初始化动作。
  • 构造函数是可以被private修饰的,作用:其他程序无法创建该类的对象。

构造函数和一般函数的区别

  • 构造函数在对象创建时就执行了,而且只执行一次。
  • 一般函数是在对象创建后,需要使用时才被对象调用,并可以被多次调用。

有了构造函数之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?
需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时在,这时只能通过set或者get方法来操作

this调用构造函数

  • 构造函数之间的调用可以通过this关键字来完成。
  • 构造函数调用格式
this(参数列表)

this代表的是对象;哪个对象调用了this所在的函数,this就代表哪个对象。
调用其他构造函数的语句必须定义在构造函数的第一行,原因是初始化动作要最先执行。
构造函数之间禁止出现相互调用的情况。

成员变量和局部变量同名

可以在成员变量名前面加上this.来区别成员变量和局部变量

构造函数需要注意的问题

  • 如果一旦定义其他参数列表的构造函数的话,这个隐藏的无参构造函数就会消失,所建议手写出来
  • 构造函数只有在创建对象的时候执行,当对象创建完毕之后,该对象的构造函数则不能执行
  • 成员函数只有在对象创建之后才能执行
  • 成员函数能否直接调用构造函数?不能够的,报找不到符号错误 会误认为是同名的成员函数
  • 构造函数能否直接调用成员函数呢?能够,但是 这些成员函数一般是构造函数的部分代码片段被切割 出来了而已,从语意上而言,不属于对象的特有行为(也有特例),所以这些函数长得样子就是成员函数 的样子,但没有必要向外界提供访问,所以加上private
  • 构造函数能否直接调用构造函数呢?可以,但是必须通过 this(参数列表) ,需要注意的是,构造函数可以单向调用其他构造函数,但坚决不能出现回调
  • 构造函数是在创建对象的时候执行的,可以在期间对成员变量进行初始化,问:setXXX还需要吗? 看需求,如果后期成员变量需要修改,则提供setXXX修改器

关于成员变量初始化的问题

成员变量的初始化经历了三个步骤:

  • 默认初始化(大家默认都是0值)
  • 显式初始化(大家的值都一样)
  • 针对性初始化(大家的值可选)

static关键字

static关键字的要点

  • static关键字是静态关键字
  • 主函数有static修饰则为静态函数,全局变量static修饰
  • 主要用于修饰成员变量(对象的特有属性)和成员函数,将其变为静态变量和静态函数
  • 静态变量最大的特点: 是同类下多个对象之间的共有属性
  • 定义静态变量: 在同一类下,多个对象之间有相同的属性和值,那么就可以将该属性和值从成员变量变为静态变量,目的就是为了节省空间。
  • 定义静态函数: 当一个成员函数不访问成员时,即可定义为静态函数!静态函数一旦定义出来,可以直接用类名去调用(如 Math.sqrt() ),也可以通过创建对象来去调用静态函数!
  • 静态优先于对象存在,被对象共享,在同一类中,静态无法访问非静态(成员),但非静态是可以访问静态
  • 静态函数中再不存在this(静态方法中不允许出现this,super关键字
  • 当通过对象去调用一个属性时,先找成员,再找静态,最后找父类
  • 当通过成员函数中去调用一个属性时,先找局部,再找成员,再找静态,最后找父类

使用static关键字的好处

  • 节省堆内存中的空间
  • 可以不用费力气去创建对象来调用功能
  • 可以对类进行一些初始操作(结合代码块来做)

静态变量与成员变量

变量所属不同

  • 静态变量所属与类,也称为类变两(类的属性),或者叫对象的共有属性
  • 成员变量所属于对象,也称为实例变量(对象的特有属性)

存储位置

  • 成员变量存储在堆内存中对象所属空间里
  • 静态变量存储在静态方法区中对应的字节码空间里

生命周期

  • 静态变量随着类的加载而加载,随着程序的结束而结束
  • 成员变量随着对象的创建而在堆内存中出现,随着对象的消失而消失

调用方式

  • 成员变量在外界必须通过创建对象来调用,内部的话成员函数可以直接调用成员变量,但是静态函数不能直接调用成员变量,如果非要在静态函数中调用成员的话,只能创建对象,通过对象来调用
  • 静态变量在外界可以通过对象调用,也可以通过类来调用,内部的话静态函数/成员函数可以调用静态变量

练习

在这里插入图片描述

public class Demo { 
    public static void main(String[] args) { 
        Rectangle r1 = new Rectangle(); 
        System.out.println(r1.getArea()); 
        System.out.println(r1.getPerimeter()); 
        Rectangle r2 = new Rectangle(5,10); 
        System.out.println(r2.getArea()); 
        System.out.println(r2.getPerimeter()); 
    } 
}
class Rectangle { 
    private double width = 1; 
    private double height = 1; 
    public Rectangle(){} 
    public Rectangle(double width,double height) { 
        this.width = width; 
        this.height = height;
    }
    public double getArea() { 
        return width * height; 
    }public double getPerimeter() { 
        return 2 * (width + height); 
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值