面向对象编程

java编程核心套路

一、程序里的数据存储

变量、数组、二维数组、对象...

1、对象

(1)定义:一种特殊的数据结构(可以理解成一张表)。class也就是类,称为对象的设计图(对象的模板)

在计算机中是一块内存,在jvm中划分为了栈内存(运行main)、堆内存、方法区(放 类)

(2)案例
  • 因为一个类文件中,只允许一个类出现,所以设计类在一个文件,每次 new 一个新对象在另外一个文件
  • new 一个新对象之后,因为都要进行输出,既然多个对象之间输出的内容都是一致的,那么就直接将输出写为一个方法,然后放到设计类的文件中

二、类的基本语法

1、构造器

(1)定义
  1. 没有返回值,名字必须与所在类名字一样,就是个特殊的方法
  2. 分为有参数构造器和无参数构造器
  3. 甚至这个构造器还可以重载,之前是方法的时候叫做方法重载,现在是构造器,可以叫做构造器重载
(2)特点
  1. 创建对象时,对象会去调用构造器
  2. 创建对象时,同时完成对对象成员变量(属性)的初始化赋值
    1.创建对象时,对象会去调用构造器

Student类文件中写了有无参数的构造器,然后在Test文件中创建对象的时候,发现已经自动调用了对象中的构造器,从运行Test文件输出了类文件中构造器里边输出的内容就可以看出来了

2.创建对象时,同时完成对对象成员变量的初始化赋值

  • 在类中,创建的属性有name,age和sex
  • 如果是要创建对象时,要为每个属性赋值,那么就需要对象点变量名为其赋值,如果是有成百上千个变量的话,那么就需要点很多
  • 但如果是写了带参的构造器的话,直接在构造器中完成赋值操作,创建对象之后会主动调用构造器,完成了赋值操作,只需要进行打印输出即可

2、this

(1)定义

this关键字就是一个变量,可以用在方法中,来拿到当前对象

  • 创建了类,其中定义了一个方法:输出this
  • 创建对象,对象调用该方法,输出的this指向了该对象
  • 对象中输出本对象,发现该对象地址和调用的方法this指向地址是一样的,所以就能证明哪个对象调用这个方法,this就是指向谁
(2)应用场景

主要用来解决变量名称冲突问题

  • 在类中设计方法,传参 name,传入的是爱好,并且输出谁喜欢什么爱好
  • 创建对象之后,还需要给name赋值,这个name表示人,那么这两个 name 就有问题了,冲突了
  • 这个时候可以在设计类的方法中使用 this.name 表示谁,因为 s2 调用了该方法,那么 this就是指向的 s2对象,this.name就是具体名字了

3、封装

  • 面向对象的三的基本特征:封装、继承、多态
  • 类就是一种封装,方法也是一种封装
(1)封装的设计要求:合理隐藏、合理暴露

如下,如果不进行适当的隐藏,那么下面创建的对象中的属性就会被恶意赋值。那么如何进行隐藏呢,也就是为类的成员变量加上 private

  • 但是也还是要进行暴露的,那就是使用public的get和set方法合理暴露成员变量的取值和赋值。
  • 使用setAge方法进行赋值,没有返回值,那么在创建对象的时候对属性进行赋值就是调用setAge()方法了。
  • 取值时,要有返回类型,取值就是直接返回 age

4、javabean实体类

(1)类中成员变量全部私有,并且提供 getter 和 getter两个方法

getter和setter方法因为是通用的,所以可以自动生成

(2)提供无参构造器,有参构造器可选

同样构造器也可以自动生成

①无参数构造器的自动生成
②有参数构造器的自动生成
③实体类的基本作用:创建它的对象,存取数据(封装数据)
(3)实体类的应用场景
  • 在分层思想中已经设置了学生对象只负责存和取出(有参构造器已经赋值了,创建对象时只需要进行打印就行;无参构造器还需要调用setter方法进行存储)
  • 那么我想要对学生对象数据进行操作处理,那么就需要新创建一个类用于处理,例如算学生总成绩或者平均成绩
  • 在这个类中需要处理学生数据,那么就是得拿到学生数据,一种方法是直接将学生对象传入到需要的方法之中;另外一种方法就是用类的有参构造器进行传递。
  • 第二种方法详解:就是在类中定义有参构造器,参数就是student类型对象 s,然后通过在创建对象时,传入实际参数对象 s2,那么在创建对象时就会回到创建类中执行代码,把实际参数 s2 赋值给 student s,student s 再赋值给类中的 s,现在类当中 的 s 存储的就是 对象 s2 了,操作类中需要处理 s2 时,直接就使用 s了
    注意:区分成员变量和参数:当方法参数名与成员变量名相同时,使用 this 来区分两者

this关键字的基本原理:

  • this指向当前对象实例:this关键字始终指向当前正在指向方法的对象实例
  • 区分成员变量和参数:当方法参数名与成员变量名相同时,使用this来区分两者

5、static关键字

叫静态,可以修饰成员变量、成员方法

成员变量按照有无 static修饰,分为两种:

  • 静态变量(类变量):有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享
  • 实例变量(对象的变量):无static修饰,属于每个对象
(1)static 修饰成员变量
①static静态变量的定义
如下,静态成员变量可以被类和类的全部对象访问,类和类的全部对象都能给这个静态变量赋值,那么最终输出时值是最后一个,因为后面的能把前面的赋值给覆盖掉了,所以下面两个输出都是 "秋雅"

实例变量属于对象,每个对象都有一份,各自是各自的

计算机先加载 Test类 进入方法区,先执行。再把 main 方法提到 栈中执行,main方法执行第一行代码要碰到学生类Student,那么就将 学生类 Student提到方法区。加载之后会扫面看是否有静态变量,如果有的话,也立即加载一份到堆内存,然后在里边开辟name空间,一开始存的是 null

②静态变量的应用场景
  • 如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成静态变量来记住。
  • 要求用户记住自己创建了多少个对象。因为无论是创建了多少个对象,这个数据都只是一份,不是说创建的对象每个一个,所以可以使用静态变量来记录。因为在创建对象时,对象会去调用构造器,所以可以在构造器中访问静态变量,对其进行每次调用就加1运算
(2)static修饰方法

同样的,static能修饰成员变量,自然也能修饰成员方法

  • 静态方法:有static修饰的成员方法,属于类。能通过类和类创建的对象访问
  • 实例方法:无static修饰的成员方法,属于对象。只能通过对象访问。
①静态成员方法:

可以发现类和对象都能访问

②实例方法:只有对象能访问

这里是先在类中设置了 score 变量私有,通过 set方法赋值,然后在printPass中执行代码。然后对象调用printPass。

  • 如果该方法只是为了做一个功能且不需要直接访问对象的数据,这个方法直接定义成静态方法
  • 如果这个方法是对象的行为,需要访问对象的数据,这个方法必须定义成实例方法
(3)静态方法的应用

把常用的方法封装到一个类中,提高复用率

为什么工具类中的方法要用静态方法,而不是实例方法呢?

(4)static的注意事项

静态方法中可以直接访问静态成员,不可以直接访问实例成员

实例方法中无论是静态成员还是实例成员都能访问

实例方法中可以出现 this 关键字,静态方法中不允许出现 this 关键字

三、综合小项目

简易版电影信息展示系统

1.设计电影类Movie,以便创建电影对象,封装电影数据

2.封装电影中的全部数据

3.创建电影操作对象,专门负责电影数据的业务操作

相关推荐
资生算法程序员_畅想家_剑魔2 小时前
Java常见技术分享-11-责任链模式
java·spring boot·责任链模式
计算机程序设计小李同学2 小时前
动漫之家系统设计与实现
java·spring boot·后端·web安全
程序员阿鹏3 小时前
责任链模式
java·spring·servlet·tomcat·maven·责任链模式
@淡 定3 小时前
Java内存模型(JMM)详解
java·开发语言
czhc11400756633 小时前
C# 1221
java·servlet·c#
黄俊懿3 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的回滚
java·后端·spring·spring cloud·微服务·架构·架构师
派大鑫wink3 小时前
【Day12】String 类详解:不可变性、常用方法与字符串拼接优化
java·开发语言
JIngJaneIL3 小时前
基于springboot + vue健康管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
秋饼3 小时前
【三大锁王争霸赛:Java锁、数据库锁、分布式锁谁是卷王?】
java·数据库·分布式