JAVA基础复习
Java面向对象
- 面向对象的三大特性:封装、继承、多态
1、对象的内存图
-
一个对象内存图
-
-
两个对象的内存图
-
-
使用类作为方法的返回值
-
2、封装
- java中封装的表现形式(封装就是将一些细节隐藏起来,对外界不可见)
- 方法就是一种封装
- 关键字
private
也是一种封装
2.1、private关键字
-
使用了private 关键字之后,本类之中的仍然可以随意使用,但是超出本类就不能直接访问
-
package com.one; public class Person { private String name=""; private boolean male; /*使用了private 关键字之后,本类之中的仍然可以随意使用,但是超出本类就不能直接访问 * */ public String getName() { return name; } public void setName(String name){ this.name=name; } //对于布尔类型的返回值需要将对应的getXXX方法改为isXxxx,set方法不变 public void setMale(boolean a){ male=a; } public boolean isMale(){ return male; } }
2.2 .this关键字的使用
-
当方法的局部变量和成员变量重名的时候,根据就近原则优先使用局部变量;如果需要使用成员变量需要使用的格式
this.成员变量
-
通过谁调用的方法,谁就是this,(即调用方法的对象)
2.3.构造方法
- 构造方法不要写返回值类型两
void
也不要写 - 构造方法不要写
return
返回值 - 如果不写构造方法,编译器会默认添加一个无参,无方法体的构造方法;
- 一旦编写至少一个构造方法,默认编译器将不在有默认添加构造方法;
- 重载:方法名称相同,参数列表不同
- 构造方法可以重载,即一个类可以有多个构造方法
package com.one;
public class Demo2 {
public static void main(String[] args) {
Person per=new Person();
per.setName("傻狗");
per.say("二哈");
System.out.println(per);
}
}
package com.one;
public class Person {
public Person(){
System.out.println("我是构造方法");
}
private String name="";
private boolean male;
/*使用了private 关键字之后,本类之中的仍然可以随意使用,但是超出本类就不能直接访问
* */
public String getName()
{
return name;
}
public void setName(String name){
this.name=name;
}
//对于布尔类型的返回值需要将对应的getXXX方法改为isXxxx,set方法不变
public void setMale(boolean a){
male=a;
}
public boolean isMale(){
return male;
}
public void say(String name){
System.out.println("我是局部变量"+name);
System.out.println("我是成员变量"+this.name);
System.out.println(this);
}
}
2.4 标准类 javaBean
-
一个标准类的格式通常拥有以下四个要求
- 所有成员变量使用private修饰
- 为每个成员变量生成SETTER/Getter方法
- 编写一个无参构造函数
- 编写一个全参构造函数
-
package com.one; public class Student { public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3、Scaner类的使用
3.1.引用类型一般使用步骤
- 1、导包
- import 包路径.类名称
- 如果需要使用的目标类和当前类位于同一个包下,则可以省略不写。
- 只有java.lang包下的内容不需要导包; 其他都需要使用import语句
- 2、创建
- Class object =new Class();
- 3、使用
- 对象名.成员方法名
3.2、 Scaner类
package com.two;
import java.util.Scanner;
public class DemoScaner {
public static void main(String[] args) {
// System.in表示是从键盘输入
Scanner sc = new Scanner(System.in);
// 获取输入的数字nextInt();//nextint去到的也是字符串但是转换成了int类型
int number= sc.nextInt();
System.out.println("获取到的数字是"+number);
// 获取字符串
String str =sc.next();
System.out.println("获取到的字符串是"+str);
}
}
3.3、匿名对象
创建对象的标准格式
标准格式:Person object =new Persion()
匿名格式 :new Persion()
-
注意事项:匿名对象只能使用唯一的一次,下次使用不得不再创建一个新对象
-
使用建议 : 如果确定一个对象只需要使用唯一的一次,就可以使用匿名对象;
package com.two;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
//标准格式
//Scanner sc= new Scanner(System.in);
//sc.next();
//匿名对象
String str=new Scanner(System.in).next();
System.out.println(str);
System.out.println("===============================");
//匿名对象传参
System.out.println("===============================");
//返回值
Scanner funk=methodKey();
String cc=funk.next();
System.out.println("cc");
System.out.println("=============Hello===========");
}
//匿名对象当做参数
public static void method(Scanner sc){
int a= sc.nextInt();
System.out.println("参数方法"+a);
}
//使用匿名对象 当做返回值
public static Scanner methodKey(){
return new Scanner(System.in);
}
}
4、Random类
-
通常用来生成随机数字,Random也属于引用类型的使用步骤;
-
package com.two; import java.util.Random; public class DemoRandom { public static void main(String[] args) { //导包后实例对象 Random r=new Random(); int num =r.nextInt(); //当nextInt中不写任何参数时,随机数的范围是int的整个范围,包含负数部分 System.out.println("产生的随机数字是"+num); // 写入参数,nextInt使用的是取头不取尾的区间形式, //如果需要使用指定区间的时候需要在对应的结尾值+1 int rannum=r.nextInt(10);//范围是0-9取头不取尾 System.out.println("产生的随机数字是"+rannum); } }
5、对象数组
-
package com.two; public class DemoArray { public static void main(String[] args) { // 创建对象数组 //创建对象数组长度为3用来存放Person类型 Person[] array=new Person[3]; Person one =new Person("古力娜扎",20); Person two =new Person("迪丽热巴",20); Person three= new Person("傻狗",30); array[0]=one;//地址值,将one的地址值赋值到0号元素 array[1]=two; array[2]=three; System.out.println(array[0]); System.out.println(array[1]); System.out.println(array[2]); System.out.println(array[0].getName()); /*数组有一个缺点,一旦被创建,程序运行期间不允许改变*/ } }
6、集合ArrayList
-
集合就是一种容器,可以用来存储多个数据
-
java集合参考文档:
https://www.runoob.com/java/java-collections.html
-
数组的长度是不可变的,但是
ArrayList
的长度是可以任意 改变的 -
对于ArrayList有一个尖括号代表
<E>
代表泛型,即集合存储的都是对象- 泛型:也就是装在集合内的所有元素,全部都是统一类型
- 泛型:
https://www.cnblogs.com/coprince/p/8603492.html
- 泛型:
- 注意:泛型只能是引用类型,不能是基本类型;
- 泛型:也就是装在集合内的所有元素,全部都是统一类型
-
注意事项:对于ArrayList集合来说直接打印,显示的不是地址值,而是内容。如果内容是空得到的是空的只能中括号
[ ]
-
提示:方法与Python中的列表相类似
-
package com.two; import java.util.ArrayList; public class DemoArrayList { public static void main(String[] args) { //创建集合list,全部都是String类型的数据 //从JDK1.7开始创建集合时,右面中括号的中不用写泛型 ArrayList<String> list =new ArrayList<>(); System.out.println(list);//[] list.add("章北海"); list.add("程心"); list.add("章北海"); System.out.println(list);//[章北海, 程心, 章北海]允许重复值 } }
-
也可以存储自定义的对象
6.1、ArrayList常用方法
-
添加
-
add
-
向集合中添加元素,添加类型与泛型一直,返回值代表是否成功(布尔值)
注:对于ArrayList集合来说,add添加动作一定成功,所以返回值可用可不用;但是对于其他集合来说,add添加不一定成功;
-
-
获取
- get
- 从集合中获取元素,参数是索引,返回值是索引对应的位置元素(索引从0开始);
-
删除
- remove
- 从集合中删除元素,参数是索引编号,返回值就是被删掉的元素
-
获取长度
- size
- 获取集合的长度,返回是集合中的元素个数。
-
package com.two; import java.util.ArrayList; public class DemoArrayList { public static void main(String[] args) { //创建集合list,全部都是String类型的数据 //从JDK1.7开始创建集合时,右面中括号的中不用写泛型 ArrayList<String> list =new ArrayList<>(); System.out.println(list);//[] list.add("章北海"); list.add("程心"); list.add("章北海"); System.out.println(list);//[章北海, 程心, 章北海]允许重复值 boolean flag =list.add("自然选择舰长:东方延续"); System.out.println(flag); System.out.println(flag); list.remove(1); String whoname=list.remove(2); System.out.println("被删除的是"+whoname); int lenlist =list.size(); System.out.println(list); System.out.println("现在集合的长度是"+lenlist); System.out.println("====================================="); list.add("丁仪"); list.add("傻孩子门,快跑啊!"); //遍历集合 for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }
-
6.2 、存储基本类型
-
如果需要向集合ArrayList当中存储基本类型数据;必须使用对应的
包装类
;- 基本数据类型:byte,int, short, long, boolean,char, float,double等
- 包装类型 : Byte,Integer,Short,Long,Boolean,Character,Float,Double等
-
package com.two; import java.util.ArrayList; public class DemoArrayList { public static void main(String[] args) { //使用包装类 ArrayList<Integer> intlist = new ArrayList<>(); intlist.add(123); System.out.println(intlist.get(0)); } }
-
从JDK1.5开始,支持自动装箱:基本类型 ---->包装类型,自动拆箱:封装类型----->基本类型;即放入集合前是
int
型,放入集合后是Integer
型,取出来是,自动将Integer
类型转换为int
型
6.3 集合框架
7、字符串String类
7.1字符串的特点
- 字符串是常量,内容不可变------ 重点
- 字符串不可改变,所以字符串可以是共享使用
- 字符串效果上相当于是char[]字符数组,但底层是byte[]字节数组。
7.2 字符串创建的方法
-
常见3+1方法
-
三种构造方法
public String() //创建一个空白字符串,不包含任何内容 public String(char[] array) //根据字符数组的内容,来创建对应的字符串 public String(byte[] array)//根据字节数组的内容,来创建对应的字符串
-
一种直接创建
String str ="";
-
-
字符串不管有没有new,都是对象,但是直接使用
""
创建的字符串由JVM补充new的过程; -
被创建的字符串对象可以被修改,过程类似于两个对象中引用(个人见解)
-
package com.three; /* * java.lang.String类代表字符串 * API:java字符串中的所用字符串字面值(如“abc”)都作为此类的实例实现 * 即,程序中的所有双引号都是String类的对象,就是算是没有new,也照样是 * */ public class DemoString { public static void main(String[] args) { //三种构造方法 String str1= new String(); System.out.println("第一个字符串是"+str1); char[] chararray={'A','B','C'}; String str2= new String(chararray); System.out.println("第二字符串是"+str2); byte[] bytearray={97,98,99}; String str3 =new String(bytearray); System.out.println("第三个字符串是"+str3); //直接创建 String str4 ="HELLO WORLD"; System.out.println("第四个字符串是"+str4); //================= str1="hello heell0"; System.out.println("我给第一个字符串赋值了,第一个字符串是"+str1); } }
7.3 字符串的常量池
-
从jdk1.7开始字符串常量池存储在堆内存当中
-
直接使用的字符串存储在字符串常量池中
- 对于引用类型来说,==进行的是地址值的比较
- 双引号直接写的字符串在常量池中,new的不在池当中;
-
-
package com.three; public class DemoStr { public static void main(String[] args) { String str1="abc"; String str2="abc"; char[] arr = {'a','b','c'}; String str3=new String(arr); System.out.println(str1==str2); System.out.println(str3==str2); System.out.println(str2==str3); } }
7.4 equals方法和equalsIgnoreCase方法
-
备注:任何对象都能使用Object进行接收。
-
equals方法具有对称性,即a.equals(b)和b.equals(a)的效果一样
-
如果比较双方一个常量一个变量,推荐把常量字符串写在前面;
- 推荐:
"aba".equals(str)
- 不推荐:
str.equals("aba")
- 推荐:
-
equalsIgnoreCase
方法忽略大小写; -
package com.three; /* * == 进行的是对象的地址值比较 * public boolean equals(Object obj):参数可以是任何对象;只有参数是一个字符串并且内容相同才会返回true,否则返回False * 注意事项:任何对象都能用Object接收 * * */ public class DemoStr { public static void main(String[] args) { String str1="abc"; String str2="abc"; char[] arr = {'a','b','c'}; String str3=new String(arr); // System.out.println(str1==str2); // System.out.println(str3==str2); // System.out.println(str2==str3); System.out.println(str2.equals(str1)); System.out.println(str2.equals(str3)); System.out.println("abc".equals(str3));//推荐写法 System.out.println(str3.equals("abc"));//不推荐写法,容易报出空指针异 // =========== //空指针异常 // String str4=null; // System.out.println(str4.equals("abc")); /*java.lang.NullPointerException at com.three.DemoStr.main(DemoStr.java:27)*/ String str5="aBc"; System.out.println(str2.equals(str5));//FALSE System.out.println(str2.equalsIgnoreCase(str5));//true } } /*console * true true true true false true */
7.5 String当中与获取相关的方法有
-
长使用方法
-
public int length():获取字符串中的字符个数,获取字符串的长度 public int indexOf(String str):查找参数字符串在中本字符串中首次出现的索引位置,没有则返回-1 public String concat():将当前的字符串和参数字符串拼接成为新的字符串,并返回新的字符串 public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始)
-
示例
package com.three; public class DemoStringGet { public static void main(String[] args) { int strlen="ABCDEFG".length(); System.out.println("字符串的长度是"+strlen); int index ="Hello world".indexOf("llo");//2 System.out.println(index);//2 String str="Hello world".concat("WUSIR"); System.out.println(str);//Hello worldWUSIR char ch="Hello world".charAt(6); System.out.println(ch);//w } }
7.6 字符串的截取方法
-
常见的方法
-
public String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串 public String substring(int begin,int end):截取从begin开始到end结束,取头不取尾
-
package com.three; public class DemoStringSub { public static void main(String[] args) { String str1="Hello world"; System.out.println(str1.substring(3)); System.out.println(str1.substring(3, 7)); System.out.println(str1);//字符串不发生改变; } } /* console: lo world lo w Hello world */
-
7.7字符串的转换方法
-
package com.three; /* public char[] toCharArray():把当前字符串拆分成字符数组作为返回值 public byte[] getBytes();获得当前字符串的底层字节数组 public String replace(CharSequence oldString;CharSequence newString):将所有出现的老字符串替换成为新的字符串,返回替换之后结果字符串 备注:CharSequence是接口可以接受字符串类型 */ public class DemoStringConvert { public static void main(String[] args) { //转换为字符数组 char[] chars ="hello".toCharArray(); System.out.println(chars[0]); //转换为字节数组 byte[] bytes="abc".getBytes(); for(int i=0;i<bytes.length;i++){ System.out.println(bytes[i]); } System.out.println("=================="); String str1="Hhello do do do weide"; String str2=str1.replace("do", "new"); System.out.println(str2); } }
7.8字符串的分割方法
-
package com.three; /* 分割字符串的方法 public String[] spilt(String regx):按照字符串规则将字符串切分为若干部分 注意事项: split方法的参数其实是一个正则表达式,使用英文的.进行切分需要转义写成\\. * */ public class DemoStringSpilt { public static void main(String[] args) { String str1="aaa,bbb,ccc"; String[] strarry=str1.split(",");//按照逗号进行分割; for(int i=0;i<strarry.length;i++){ System.out.println(strarry[i]); } System.out.println("========="); String str2="aaa.bbb.ccc"; String[] strarry2=str2.split("\\.");//按照逗号进行分割; for(int i=0;i<strarry.length;i++){ System.out.println(strarry2[i]); } } } /*Console aaa bbb ccc ========= aaa bbb ccc */