引言:
因为我之前学过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
案例:影片信息在程序中表示
分析:每部电影相当于一个对象 设置一个电影类 再将每一个对象添加到集合里面即可
案例:
学生信息系统的数据搜索(根据学号搜索)
思路:定义学生类+集合泛型学生类+添加数据+请用户输入要搜索的学生信息+对应打印
可以看到类+集合的组合可以很强大,一般做什么管理系统,都可以按这种思路设计。
最后的最后,感谢大家的阅读,希望你能有所收获!!!