1.2 面向对象基础
1.2.1 面向对象与面向过程
面向对象:把所有事物都当作独立的对象,在处理问题过程中考虑问题中各个对象之间的关系,java语言采用的就是面向对象思想;
面向过程:以处理问题的过程为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用,是一种基础的顺序的思维方式,C语言是采用面向过程的思想;
1.2.2 类和对象的概述
类:就是一段描述信息,主要是从事物具备的属性和行为去描述。(对一些列具有共同属性和行为的描述)。类是Java的基本组成部分。
属性:就是事物具备的特征;
行为:就是事物能做什么事;
对象:万物皆对象,我们看得到摸得着的都是对象。
类和对象的关系:
在实际生活中,类就是对象的描述信息,先有对象后有类;
在Java中,类也是对象的描述信息,但是是先有类后有对象;类是对象的数据类型。
1.2.3 分析对象在内存中的存储
单个对象:
在创建对象的时候,new会在堆内存中申请一块内存空间,new 出来的对象会存放在堆内存中,这个时候,对象的成员变量的值是默认值,和数组的默认值规则一样。
当给对象的成员变量赋值时,所赋的值会覆盖原有的默认值。
成员方法在被调用的时候会进栈,当方法调用完毕之后,会弹栈。
多个对象:
多个对象存放在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,对于成员方法,多个对象公用一份。
多个对象指向同一地址时:
当多个对象的引用指向同一内存空间时,变量所记录的地址值是一样的,只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
1.2.4 成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
位置不一样 | 类中方法外 | 方法的声明上/方法的内部 |
内存的位置不一样 | 在堆内存 | 在栈内存 |
声明周期不一样 | 随着对象的创建而创建,随着对象的消失而消失 | 随着方法的调用而创建,随着方法的弹栈而消失 |
初始化值 | 有,系统默认 初始化值 | 没有,需要手动去赋值 |
1.2.5 private关键字的应用
在没有使用private关键字之前,数据不安全,使用private关键字之后,提高了代码的安全性。
使用private修饰的变量在别的类是没有办法使用的,只能在当前的类里面使用。
1.2.6 this关键字的应用
如果成员变量和局部变量同名的时候,我们使用this来区分成员变量和局部变量。
this.变量名 代表的是当前类的成员变量
this:其实就是代表当前的对象
1.2.7 this关键字的内存原理
是哪一个对象调用,this就引用的(地址)是那个对象
1.2.8 面向对象特性之封装
封装的概述:
是面向对象三大特征之一(封装,继承,多态)
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
封装的原则:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXxx()/setXxx()方法
封装的好处:
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
1.2.9 构造方法(Constructor)
构造方法是一种特殊的方法,体现在两方面:作用特殊和结构特殊
作用:创建对象,同时初始化成员变量,
格式:没有void,也没有返回值类型
没有return,但是会返回一个地址
public class 类名{
//无参构造
修饰符 类名(){
}
//有参构造
修饰符 类名(参数列表){
this.参数1=参数1;
this.参数2=参数2;
……
}
}
1.2.10 构造方法的注意事项
系统会给我们提供一个默认的无参构造方法
如果我们自己写了构造方法以后,系统就不会给我们提供默认的无参构造。
如果我们写上了构造方法,建议把无参构造也写上
1.2.11 标准类的定义规范(编程习惯)
成员变量私有
两种构造方式都要写
给对应的成员变量提供get/set方法
1.3 API基础
1.3.1 API的使用方式
API(Application Programming Interface):应用程序接口
java中的API指的是JDK中提供的各种功能的java类,这些类将底层的实现封装了起来
1.3.2 String类的特点
首先String类代表字符串,java程序中的所有字符串文字都是此类的实例。换句话说:java程序中所有的双引号字符串,都是String类的对象。String类都在Java.lang的包下,注意String类在使用时不需要导包!
特点:
1.字符串不可变,它们的值在创建之后不能被改变
2.String类对象的值是不可以被改变的,但是他们可以被共享
3.字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])
1.3.3 String类的常用构造方法
public String() 创建一个空白字符串对象,不含有任何内容 String s1=new String()
public String(char[]chs) 根据字符数组的内容,来创建字符串对象 String s2=new String(char[]ch)
public String(byte[]by) 根据字节数组的内容,来创建字符串对象 String s3=new String(byte[]by)
String s4=“abc123” 直接赋值的方式创建字符串对象
通过new来创建字符串对象,每一次new,都会在堆内存里申请一个内存空间,虽然内容相同,但是地址值不同。
通过直接赋值方式创建,同一个字符串,只要字符序列相同(顺序和大小写),无论在程序中出现多少次,JVM都只会建立一个String对象
1.3.4 字符串的比较规则
“==”:在比较基本数据类型时,比较的是具体的值;在比较引用数据类型时,比较的是对象的地址值。
“equals”:String类的equals方法,是用来比较两个对象的内容是否相等(区分大小写),与地址值无关。其他类中的equals方法也是比较地址值,只有在String类中是比较两者内容,因为在String类中重写了equals方法,如果要想equals方法只比较内容可以在类中重写equals方法。
“equals IgnoreCase”:String类中的equals IgnoreCase方法是用来比较两个对象在忽略大小写的前提下的内容是否相等。
1.3.5 equals方法来简单使用实例
public class StringTest1{
public static void main(String[]args){
String userName="Zhangliming";
String userPassword="zlm123456"
for(int i=0;i<3;i++){
Scanner sc= new Scanner(System.in);
System.out.println("请输入用户名:");
String name=sc.nextLine();
System.out.println("请输入密码:");
String password=sc.nextLine();
if(name equals(userName)){
System.out.println("登录成功!")
break;
}else{
if(i==2){
System.out.println("登陆失败,账号被锁定!")
}else{
System.out.println("还有"+2-i+“次机会”)
}
}
}
}
}
1.3.6 遍历字符串的方式
掌握方法 char 变量名=字符串对象名.charAt(i)。返回指定字符串索引处的char值,字符串的索引也是从0开始的。
掌握方法 **字符串对象名.length()**能够获取字符串的长度。
public class StringTest2{
public static void main(String[]args){
Scanner sc =new Scanner(System.in);
System.out.println("请录入一个字符串:")
String s1=sc.nextLine();
for(int i=0; i<s1.length(); i++) {
char ch= s1.charAt(i);
System.out.println(ch);
}
}
}
1.3.7 字符串的拼接
public class StringTest3{
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s1=sc.nextLine();
String s2="[";
for(int i=0;i<s1.length();i++){
s2+=s1.charAt(i);
}
s2+="]";
System.out.println(s2);
}
}
1.3.8 字符串的反转操作
public class StringTest3{
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s1=sc.nextLine();
String s2 ="";
for(int i=s1.length()-1;i>=0;i--){
s2+=s1.charAt(i);
//System.out.print(s1.charAt(i)+" ");
}
System.out.println(s2);
}
}
1.3.9 StringBuilder类的作用
StringBuilder是一个可变的字符串类,我们可以把它看成一个容器,这里的可变指的是StringBuilder对象中的内容是可变的
String类:内容是不可变的
StringBuilder类:内容是可变的
StringBuilder线程不安全,StringBuffer线程安全
1.3.10 StringBuilder类的构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
1.3.11 StringBuilder类的常用方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
1.3.12 用StringBuilder完成字符串拼接和反转
public class StringTest3{
public static void main(String[]args){
String s1="hello";
String s2="world";
StringBuilder sb=new StringBuilder(s1);
sb.append(s2);
String s3=sb.toString();
System.out.println(s3);
sb.reverse();
String s4=sb.toString();
System.out.println(s4);
}
}
1.4 集合基础
1.4.1 ArrayList集合的特点
集合是一种存储空间可变的存储模型,存储的数据容量可以发生改变,与数组不同,数组的容量是不变的。
集合的底层是数组实现的,长度可以变化。
泛型:,用于约束集合中存储元素的数据类型。
1.4.2 ArrayList的构造方法
创建一个空的集合对象-------------------public ArrayList<>
创建一个集合:ArrayListlist =new ArrayList<>(); 其中E:放引用 数据类型:类、数组、接口。例如:
可以放一个类名:
ArrayListlist=new ArrayList<>();
可以放基本数据类型的包装类:
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
ArrayListList=new ArrayList<>();
1.4.3 ArrayList的常用操作
删除操作:list.remove(Object o) list.remove(int index) 注意 顺序遍历删除的时候,要i–;逆序遍历删除的时候,不用i–;
增添操作:list.add(E element) list.add(int index,E element) 没加index默认在末尾加
修改操作:list.set(int index,E element)
查询操作:list.get(int index) 注意:要找一个对应类型的对象来接 收。
查询长度操作: list.size();
1.4.4 集合存储自定义类型并遍历
1.创建集合对象,
2.往集合中添加字符串对象;
3.遍历集合:for(int i=0;i<list.size();i++){
对应类型 对象=list.get(i);
System.out.println(对象)
}