Day13 一 封装
1.1 封装概述
概述
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
原则
将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。
1.2 封装的步骤
1.使用private关键字来修饰成员变量。
2.对需要访问的成员变量,提供对应的一对getXxx方法、SetXxx方法。
1.3 封装的操作——private关键字
private是一个权限修饰符,代表最小权限。可以修饰成员变量和成员方法。被private修饰后的成员变量和成员方法,只在本类中才能访问。
private的使用格式
private 变量类型 变量名称;
代码如下:
public class Student { private String name; private int age;}
提供getXxx方法/setXxx方法,可以访问成员变量,代码如下:
public class Student { private String name; private int age; public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; }}
二this关键字和构造方法
2.1 this关键字
我们发现setXxx方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下:
public class Student { private String name; private int age; public void setName(String name) { name = name; } public void setAge(int age) { age = age; }}
形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。使用this关键字,解决这个重名问题。
this的含义
this代表所在类的当前对象的引用(地址值),即对象自己的引用。
this使用格式
this.成员变量名;
使用this修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student { private String name; private int age; public void setName(String name) { //name = name; this.name = name; } public String getName() { return name; } public void setAge(int age) { //age = age; this.age = age; } public int getAge() { return age; }}
this内存原理【理解】
this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象
示例代码:
public class StudentDemo { public static void main(String[] args) { Student s1 = new Student(); s1.setName("林青霞"); Student s2 = new Student(); s2.setName("张曼玉"); }}
封装思想【理解】
封装是面向对象三大特征之一(封装,继承,多态)是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
封装原则:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()/setXxx()方法
封装好处通过方法来控制成员变量的操作,提高了代码的安全性把代码用方法进行封装,提高了代码的复用性
2.2 构造方法
当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。
构造方法的定义格式
修饰符 构造方法名(参数列表){ // 方法体}
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用构造方法后,代码如下:
public class Student { private String name; private int age; // 无参数构造方法 public Student() {} // 有参数构造方法 public Student(String name,int age) { this.name = name; this.age = age; }}
注意事项
如果你不提供构造方法,系统会给出无参数构造方法。
如果你提供了构造方法,系统将不再提供无参数构造方法。
构造方法是可以重载的,既可以定义参数,也可以不定义参数。
2.3 标准代码——JavaBean
JavaBean是Java语言编写类的一种标准规范。符合JavaBean的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的set和get方法。
三API
3.1 API概述
API (Application Programming Interface) :应用程序编程接口
Java API是一本程序员的字典,是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。所以我们可以通过查询API的方式,来学习Java提供的类,并得知如何使用它们。
3.2 如何使用API帮助文档【应用】
打开帮助文档
找到索引选项卡中的输入框
在输入框中输入Random
看类在哪个包下
看类的描述
看构造方法
看成员方法
四String类
4.1 String类概述
`java.lang.String` 类代表字符串。Java程序中所有的字符串文字(例如`"abc"` )都可以被看作是实现此类的实例。
类String中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本。
4.2 String类的特点
字符串不变:字符串的值在创建后不能被更改。
String s1 = "abc";s1 += "d";//s1 = s1 + "d";System.out.println(s1); // "abcd" // 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc";String s2 = "abc";// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
"abc"等效于char[] data={ 'a' , 'b' , 'c' },但是底层原理是字节数组( byte[] )
例如: String str = "abc";相当于: char data[] = {'a', 'b', 'c'}; String str = new String(data);// String底层是靠字符数组实现的。
4.3 String类的构造方法【记忆】
常用的构造方法
方法名说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(byte[] bys)根据字节数组的内容,来创建字符串对象
String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc
示例代码
public class StringDemo01 { public static void main(String[] args) { //public String():创建一个空白字符串对象,不含有任何内容 String s1 = new String(); System.out.println("s1:" + s1); //public String(char[] chs):根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs); System.out.println("s2:" + s2); //public String(byte[] bys):根据字节数组的内容,来创建字符串对象 byte[] bys = {97, 98, 99}; String s3 = new String(bys); System.out.println("s3:" + s3); //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc String s4 = "abc"; System.out.println("s4:" + s4); }}
4.4 创建字符串对象两种方式的区别【理解】
通过构造方法创建
通过new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
4.5 字符串的比较:==号和equals的作用
==比较基本数据类型:比较的是具体的值
==比较引用数据类型:比较的是对象地址值
equals比较String类型: 比较的是对象的内容是否相同
4.6常用方法
判断功能的方法
public boolean equals (Object anObject):将此字符串与指定对象进行比较。
public boolean equalsIgnoreCase (String anotherString):将此字符串与指定对象进行比较,忽略大小写。
[if !supportLists]· [endif]
五StringBuilder类
5.1 字符串拼接问题
由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder类。
5.2 StringBuilder概述
查阅java.lang.StringBuilder的API,StringBuilder又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。
原来StringBuilder是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。原理如下图所示:(默认16字符空间,超过自动扩充)
5.3 StringBuilder类和String类的区别
String类:内容是不可变的
StringBuilder类:内容是可变的
5.4 构造方法
根据StringBuilder的API文档,常用构造方法有2个:
public StringBuilder():构造一个空的StringBuilder容器。
public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去
2.5 常用方法
StringBuilder常用的方法有3个:
public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。
public StringBuilder reverse():返回反转的字符序列
public String toString():将当前StringBuilder对象转换为String对象。
5.6 StringBuilder和String相互转换
StringBuilder转换为String
public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
Day14 一ArrayList类
[if !supportLists]1.1 [endif]引入——对象数组
[if !supportLists]1.2 [endif]到目前为止,我们想存储对象数据,选择的容器,只有对象数组。而数组的长度是固定的,无法适应数据变化的需求。为了解决这个问题,Java提供了另一个容器java.util.ArrayList集合类,让我们可以更便捷的存储和操作对象数据。
1.2 ArrayList类
java.util.ArrayList是大小可变的数组的实现,存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。ArrayList中可不断添加元素,其大小也自动增长。
1.3 ArrayList使用步骤
查看类
java.util.ArrayList <E>:该类需要import导入使后使用。
<E>,表示一种指定的数据类型,叫做泛型。E,取自Element(元素)的首字母。在出现E的地方,我们使用一种引用数据类型将其替换即可,表示我们将存储哪种引用类型的元素。代码如下:
ArrayList<String>,ArrayList<Student>
查看构造方法
public ArrayList():构造一个内容为空的集合。
基本格式:
ArrayList<String> list = new ArrayList<String>();
在JDK 7后,右侧泛型的尖括号之内可以留空,但是<>仍然要写。简化格式:
ArrayList<String> list = new ArrayList<>();
查看成员方法
public boolean add(E e):将指定的元素添加到此集合的尾部。
参数E e,在构造ArrayList对象时,<E>指定了什么数据类型,那么add(E e)方法中,只能添加什么数据类型的对象。
使用ArrayList类,存储三个字符串元素,代码如下:
public class Test02StudentArrayList { public static void main(String[] args) { //创建学生数组 ArrayList<String> list = new ArrayList<>(); //创建学生对象 String s1 = "曹操"; String s2 = "刘备"; String s3 = "孙权"; //打印学生ArrayList集合 System.out.println(list); //把学生对象作为元素添加到集合 list.add(s1); list.add(s2); list.add(s3); //打印学生ArrayList集合 System.out.println(list); }}
1.4 常用方法和遍历
对于元素的操作,基本体现在——增、删、查。常用的方法有:
public boolean add(E e):将指定的元素添加到此集合的尾部。
public void add(int index,E element):在此集合中的指定位置插入指定的元素。
public boolean remove(Object o):删除指定的元素,返回删除是否成功
public E remove(int index):移除此集合中指定位置上的元素。返回被删除的元素。
public E set(int index,E element):修改指定索引处的元素,返回被修改的元素。
public E get(int index):返回此集合中指定位置上的元素。返回获取的元素。
public int size():返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。
1.5 如何存储基本数据类型
ArrayList对象不能存储基本类型,只能存储引用类型的数据。类似<int>不能写,但是存储基本数据类型对应的包装类型是可以的。所以,想要存储基本类型数据,<>中的数据类型,必须转换后才能编写
只有Integer和Character需要特殊记忆,其他基本类型只是首字母大写即可。
网友评论