Java之Java基础四(变量类型之引用类型)

一、类

  • 一个类文件里可以有多个类,但只能有一个主类
  • public修饰的是主类

 类修饰符只有两种:public和默认,public支持包外使用,默认只支持包内使用

  • 类中方法的应用
  1. 同类下直接用
  2. 同包不同类方法前加类名或创建对象
  3. 同项目不同包要导入【import】
  4. 不同项目导出导入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.8jvm对方法区的实现由永久代变成了元空间(本地内存不在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】

  • 区别:
  1. StringBuffer出现较早,并保证在多线程下不被多次重复修改【牺牲性能,保证安全,支持多线程 并发操作,慢】
  2. 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位置替换

 五、其他

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值