一、类
- 一个类文件里可以有多个类,但只能有一个主类
- public修饰的是主类
类修饰符只有两种:public和默认,public支持包外使用,默认只支持包内使用
- 类中方法的应用
- 同类下直接用
- 同包不同类方法前加类名或创建对象
- 同项目不同包要导入【import】
- 不同项目导出导入jar包
- 类名不能重复
- 每个类里面都可以加main()方法
- 类用来集成属性和方法
- 主类适用范围广,其他类只能在当前类文件中使用
- 类的引用(实例化):new
- 类方法:static 【随着类加载完成立即加载】
package test;
public class One {
public static void main(String[] args) {
//类的引用
Person p1=new Person();
Person p2=new Person();
//属性赋值
p1.age=6;
p2.age=12;
p1.name="name1";
p2.name="name2";
//对象方法调用
p1.m1();
//静态方法调用-直接调用
Person.m2();
m1();
}
//静态方法互相调用
public static void m1() {
System.out.println("静态方法调用m1");
m2();
}
public static void m2() {
System.out.println("静态方法调用m2");
m3();
}
public static void m3() {
System.out.println("静态方法调用m3");
}
}
//类的声明
class Person{
//属性定义
public int age;
public String name;
//方法定义-对象方法
public void m1() {
System.out.println("对象方法调用");
}
//静态方法-类方法
public static void m2() {
System.out.println("静态方法调用");
}
//自身引用
public void m3() {
Person p3=new Person();
}
}
二、接口(在之后面向对象详细写)
三、数组
- 同一数组中必须为同一数据类型
- 输出数组时输出的是数组的地址,默认调用toString方法
- 类型【】 数组名 =new 类型【数组大小】
//第一种方法,定义空数组,【数组里有值,为各类型的默认值,例如:int数组中默认为0】
int[] arr=new int[10]; //基本类型可作为类型
Person[] arr1=new Person[10]; //类亦可作为类型
String[] arr=new String[10]; //其他引用类型也可以
//第二种方法,定义时赋值
int[] arr={1,2,3,4,5,6}; //不可变数组【指空间固定,不可延展】
//第三种方式
int[] arr=new int[]{1,2,3,4,5,6}
//数组打印
//导包:import java.util.Arrays;
int[] arr=new int[10];
System.out.println(arr); //打印出来为数组地址
System.out.println(Arrays.toString(arr)); //打印出来为数组元素
四、字符串
1.不可变字符串【String(存放在jvm方法区)】
- 不可变即地址不可变,主要作用是避免重复的删除和销毁,为了实现数据共享,提高性能
- 字符串等值比较:不要用等号比(因为引用类型比的是地址);要想对比字符串的值,用equals()方法
//地址不可变
String a="3";
a="4";
//语法正确,相当于给a重新分配一个地址,3的内容和地址并没有变
//字符串拼接
String a="123";
String b="4567";
String c=a+b; //拼接时new了一个新对象,所以返回false (编译反编译可以看到过程)
String d="1234567";
String e="123"+"4567";//直接拼接的,并不调用new
String f=a+"4567"; //用到变量时都会调用new
System.out.println(c==d); //返回false
System.out.println(d==e); //返回true
System.out.println(f==d); //返回fals
//空串与null串
String a=null; //内容为空且不占空间
String b="";
//开辟空间但内容为空
System.out.println(a.equals(b)); //报错空指针
System.out.println(a!=null&&a.equals(b)); //短路逻辑与保证不报空指针
- 字符串常量池:存放字符串的地方
- jvm内存区域:新生代;老生代;永久代
版本 | 常量池存放位置 |
---|---|
jdk1.6之前 | 方法区中的永久代【方法区:想法;永久代:具体实现】 |
jdk1.7 | 字符串从方法区中的永久代移除,放在堆区中(永久代空间不够) |
jdk1.8 | jvm对方法区的实现由永久代变成了元空间(本地内存不在jvm内存中),放在元空间 |
- 字符串方法
//子串(截取)
String a="hello world!";
System.out.println(a.substring(6,11)); //world
//从0开始
//要头不要尾,即(6,11)为6,7,8,9,10
//只写一个数字为从数字指定位置截到字符串末尾
//获取字符串长度
if(a!=null) {
System.out.println(a.length());
}
//获取指定索引值对应字符【代码单元】
if(b!=null) {
System.out.println(b.charAt(0));
}
//获取指定索引值对应代码点【ASCLL编码值】
if(b!=null) {
System.out.println(b.codePointAt(0));
//从0开始
//从0开始【若0位置对应值为a,返回97】
}
//判断字符串是否以特定字符串结尾
String b="34534534";
if(b!=null) {
System.out.println(b.endsWith("4")); //返回true
}
//判断字符串是否以特定字符串开头
String b="34534534";
if(b!=null) {
System.out.println(b.startsWith("3")); //返回true
}
//判断字符串是否包含特定串字符
String b="34534534";
if(b!=null) {
if(b!=null) {
System.out.println(b.contains("34")); //返回true
}
}
//判断字符串是否包含特定字符串,并返回第一次符合特定字符串的开始位置索引值
//没有返回-1
String b="34534534";
if(b!=null) {
System.out.println(b.startsWith("3"));
System.out.println(b.startsWith("3",4));//跳过4个字符开始寻找
System.out.println(b.lastIndexOf("53"));//最后一次出现位置
System.out.println(b.lastIndexOf("53",7));//从指定的索引处(7)开始进行【反向】搜索最后
一次出现位置,即在索引值0~7之间搜索
}
//分割字符串
String b="534534534";
if(b!=null) {
String[] arr=b.split("34");
System.out.println(Arrays.toString(arr)); //结果[5, 5, 5]
}
2.可变字符串【有两种定义方式StringBuffer与StringBuilder】
- 区别:
- StringBuffer出现较早,并保证在多线程下不被多次重复修改【牺牲性能,保证安全,支持多线程 并发操作,慢】
- StringBuilder 【不支持并发操作,线程不安全,但速度快】
StringBuffer str=new StringBuffer("qcby");
System.out.println(str);
//最后添加
System.out.println(str.append("qcby"));
//指定位置添加,
StringBuilder str2=new StringBuilder("qcby");
System.out.println(str2.insert(2,"qcby")); //qcqcbyby
//删除指定区域字符
System.out.println(str2.delete(1,3));
//删除指定字符
System.out.println(str2.deleteCharAt(1));
//指定字符修改
str2.setCharAt(1,'a');
System.out.println(str2);
//查找
System.out.println(str2.charAt(0));
//反转
System.out.println(str2.reverse());
//替换
System.out.println(str2.replace(0,2, "666"));//要头不要尾,即0,1位置替换
五、其他