面向对象编程

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.创建电影操作对象,专门负责电影数据的业务操作

相关推荐
考虑考虑3 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯4 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路8 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还11 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev13 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序18 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏18 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev19 小时前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构