java编程核心套路
一、程序里的数据存储
变量、数组、二维数组、对象...
1、对象
(1)定义:一种特殊的数据结构(可以理解成一张表)。class也就是类,称为对象的设计图(对象的模板)
在计算机中是一块内存,在jvm中划分为了栈内存(运行main)、堆内存、方法区(放 类)





(2)案例

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

二、类的基本语法
1、构造器
(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.创建电影操作对象,专门负责电影数据的业务操作


