JavaSE之面向对象(ORM)基础知识

引言:

因为我之前学过Python,所以对于面向对象有一定的了解。记得当时我的老师举了一个洗衣机的例子:洗衣机有很多种,例如小天鹅,小霸王...洗衣机的各个参数功能是有差异的。

言而总之,总而言之:类好比是一种模型(一种数据类型);用类创建对象是面向对象的核心。当我们想用某一个模型,直接传入参数,创建对象就可以使用了;例如:查看成员变量属性和方法。这种面向对象编程的思维可以让我们的代码更加简单,同时减少了代码的冗余,提高了开发效率。

那Java面向对象呢?我们一起来看看吧!

其实我们之已经接触了Java面向对象的知识了:

例如:键盘录入技术 当你需要的时候直接创建一个对象就可以录入用户输入的信息了(Scanner sc=new Scanner(System.in););

再或者得到一个随机数(Random r=new Random();) 我们是不是就可以通过这个对象调用里面的方法开始使用了呢?答案是完全没有问题的!

再或者,我们学习数组的时候,动态初始化生成的数组(int[] arr=new int[];) 注意:共性都有一个new !!!

面向对象的本质

  • 面向:拿、找
  • 对象:东西
  • 面向对象编程:拿或者找东西过来编程

先创建一个类(模型),然后用类创建一个对象(输入属性,调用方法即可)我们自己用的东西。

在Java中必须先创建类(图纸),才能获得对象:

  • 类(设计图)、是对象的共同特征的描述
  • 对象 是真实的具体实例

类的书写规范

public class 类名{

1、成员变量 名词

2、成员方法 动词

3、构造器

4、代码块

5、内部类

}

我们想创建一个对象直接new一个对象就好了;

具体格式:类名 对象名=new 类名();    类比一下动态初始化数组  int[] 数组名=new int[];

例如,创建一个车类:

 

 类:是共同特征的描述(设计图);对象:是真实存在的具体事例。

public class 类名{

1、成员变量n.

2、成员方法v.

}

类名 对象名=new 类名();

对象名.属性

对象.方法

注意:定义类(或者说描述类)的时候,不要初始化 (也有默认值0/null)

练习:定义一个学生类,并且使用、

 

 认真理解后,面向对象很简单对吧。

定义类的补充定义:

  • 成员变量的完整格式是:修饰符 数据类型 变量名称 =初始化值,无序指定初始化值,存在默认值(0、null)
  • 类名首元素字母建议大写,且要有意义,满足驼峰模式。
  • 一个Java文件中可以定义多个class类 且只能以一个是public修饰 而且这个类名等于文件名
  • 实际开发还是要求一个类一个类的定义。

 

定义类的一些建议,有什么需要注意的?

如果要在一个文件里定义其他类本身有的这个类为public calss 类名{},其他类设置为class 类名{};

类里的属性不要赋值,直接:数据类型 变量名;

类名首字母建议大写、英文、有意义、满足驼峰式,不能使用关键字、满足标识符规定;

一个代码文件里就写一个类,仅仅只有一个类是由public修饰的;

public修饰的类名必须是Java代码的文件名称。

成员的完整定义是>修饰符 数据类型 变量名称=初始化值      一般写:数据类型+变量名称

一般无需指定初始化值,有默认值 直接对象名.属性名就可以修改了。

面向对象的内存分配:

两个对象的内存图:两个变量指向同一个对象

方法区:主要放class文件 main函数  对象

栈内存:对象地址
堆内存:对象+成员变量+方法的引用地址

 

 

 

 

 我们可以类比,两个数组,定义好一个数组,然后把这个数组名(地址)赋值给另一个数组,共同维护数组里面的数据,共享数据。

小结:

对象放在堆里面 对象名等同于存储在对象堆内存中的地址 成员变量存储在那个位置 对象中的堆里

补充知识:

  • 注意:当堆内存中的类对象或者数组对象,没有被任何变量引用(指向时),就会判断为内存中的垃圾
  • Java存在自动垃圾回收器,会定期进行检查清理

案例:购物车模拟-架构搭建

需求:模拟购物车功能,需要实现添加商品到购物车里去,同时需要提供修改商品的购买次数,结算商品价格功能(使用面向对象来解决这个问题)

分析:

商品可以看做是一个商品类 

购物车里可以看做是一个数组,他的数据是商品 所以他的类型就是商品类

完成页面架构,让用户选择操作的功能

功能菜单:

 主函数执行:

 增加商品:

 查询商品:

修改商品:

 寻找id方法:

 总计价格:

 删除商品:

这个部分我没做,但是也可以解决。原因:一开始我们是按顺序进行添加的 遇到null就停止排查了;如果增加一个删除商品的内容,难度就会加大,增加了部分内容的判断,删除本质上来说就是让这个id对应的位置地址为null。大家可以思考一下,评论区留言交流一下!!!

继续探索Java世界:
我们说创建对象是采用这种方法:类名 对象名=new 类名();

类名() ==构造器,So:对象是由构造器形成的

构造器: 目的:真正知道对象是通过调用什么代码完成的  能够掌握为对象属性的其他写法。

  • 无参构造器
  • 有参构造器

构造器的作用:

用于初始化一个类的对象,并返回对象的地址 Car c=new Car();

构造器的定义:

修饰符 类名(形参列表){

......

}

简单来说:类默认是无参构造器 但是在里面写了有参构造器,就要在里面再写无参构造器!

有参构造器,new 构造器时在(写入需要的参数即可)

小结:

  • 初始化类的对象,并返回对象的地址
  • 无参构造器,初始化对象时,成员变量采用默认值(0,null)
  • 有参构造器,在初始化对象时,同时可以为对象进行赋值
  • 任何类定义出来,默认就是无参构造器
  • 一旦有参构造器定义出来 无参构造器就化作红尘 烟消云散 你需要自己重新定义

 this关键字:

他相当于Python的self 对象  this代表当前对象的地址 用于访问成员变量和方法。

this关键字的作用:代表当前对象的地址,可以用于访问当前对象的成员变量!

 

 

 this关键字相当于当前创建的对象的地址:

封装:

  • 面向对象的三大基本特征:封装、继承、多态
  • 什么是封装:合理隐藏、合理暴露

So:封装可以解决这个问题,在类里面在写一个set、get方法 一改一用。

 

 补充:

一般成员变量使用private隐藏起来

通过getter和setter方法暴露其访问

那有人就会问,这多麻烦的一个成员变量就要对应set、get方法;我们的idea工具对我们特别好。

 

 

 

封装的好处:

  • 加强了程序代码的安全性
  • 适当的封装,可以提高开发效率,同时让程序更容易理解和维护

JavaBean标准:

  • 成员变量使用private修饰
  • 通过每个成员变量set get 方法
  • 必须有一个无参构造器

 补充知识:

成员变量和局部变量:

  • 成员变量主要存在于函数外
  • 局部变量主要存在于函数内
     

成员变量:存在于类中;有默认的初始值;堆内存里;随着对象的创建而存在,对着对象的消失而消失

局部变量:常见于方法里;使用前需要保证赋值;栈内存;随着方法的存在而存在,随着方法的消失而消失;{作用域}

常用API(String、ArrayList)字符串及集合:

回忆一下APL的概念:
通俗讲就是Java为我们已经准备的程序,直接使用即可。APL称为应用程序接口,直接调动使用。

Sting类定义可以用于存储字符串。同时String类提供了很多操作字符串的功能(api),直接使用

例如:登录时需要进行校验,一般我们的账号和密码设置为字符串类型(引用类型)

 

 字符串比较内容使用Sting.equals(OtherString)   如果采用==比较 比较的是字符串的地址。

String概述:

  • java.lang.String类代表字符串 String类定义的变量可以用于指向字符串对象,然后对应操作。
  • java程序中的所有字符串(例如:"abc")都为String类的对象。

String引用数据类型,被称为不可变数据类型,他的对象在创建后不会被更改。

例子:

那么字符串对象存储在哪里呢?
以" "出现的字符串对象存储在字符串常量池(本质就是在堆存里但是和new String对象创建不同)

String变量每次的改变其实就是指向了新的字符串对象;变量指向对象!!!

创建String的两种方式:

 

 字符串内容的比较:

equals() 比较字符串内容是否完全一样;

equalsIgnoreCase()忽略大小写比较字符串内容 ;

* == 这种比较方式一般为基本数据类型用于比较。

String常用API:

length() 字符串长度

charAt()拿某个索引对应的字符

 substring(start,end) 字符串切片 end可以不写 默认到最后一个字符结束

replace(索引,字符)

split() 字符串分割截取

 

 验证码的写法:

回忆一下之前写法:

思路:键盘录入确定验证码位数+随机数(0~3)+对应类型的区间生成+字符串+ 

案例:手机号屏蔽(中间四位)

 

ArrayList:

ArrayList代表的是集合类。集合是一种容器,与数组类似但是长度不限,我们等会可以完成一个购物车,ArrayList+面向对象.

通过创建ArrayList的对象可以得到一个集合容器,同时ArrayList提供了比数组还要好用的API。

集合与数组容器的比较:

  • 数组长度固定,集合没有长度的约束。
  • 数组不好删除,集合删除 增加会自动缩位(即动态变化)。

在个数不确定用数组容器不太好,我么这是应该选择集合。集合适合做元素个数不确定,且要进行增删操作的业务场景。集合还提供了很多好用的功能,而数组的功能很单一(赋值)。

d

 泛型概述:
还记得数组的特点嘛?存储同种类型定长度的容器 ,泛型+集合 就限制只能加入的元素类型。

ArrayList<E>其实就是一个泛型类;譬如:ArrayList<String> 只能操作字符串类型的数据,ArrayList<Integer>只能操作整形的数据

注意:

集合泛型只能是引用数据类型,不能写基本数据类型(例如:int double char byte).

案例:

遍历删除不符合需求的值:采用逆删,相反 由左至右的方法会有bug 

So:当要判断元素时一定要从后往前遍历,始终满足 没有漏数的情况!快捷键 .forr

 案例:影片信息在程序中表示

分析:每部电影相当于一个对象 设置一个电影类 再将每一个对象添加到集合里面即可

 

 

 案例:
学生信息系统的数据搜索(根据学号搜索)

思路:定义学生类+集合泛型学生类+添加数据+请用户输入要搜索的学生信息+对应打印

 

 

 

可以看到类+集合的组合可以很强大,一般做什么管理系统,都可以按这种思路设计。

最后的最后,感谢大家的阅读,希望你能有所收获!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值