Java面向对象编程----面向对象(二)

66 阅读4分钟

常用数据类型

数组

数组是一个引用数据类型,普通的赋值操作只是引用传递的过程,它们都会指向同一个堆内存地址。 增强型for循环,不用通过下标,就可以直接获取数组中的值。 for(数据类型 变量: 数组 | 集合){}

    public static void main(String[] args) {
        int data[] = new int[] {1,2,3,4};
//         数组引用传递
        int arr[] = data;

        arr[1] = 6;
        for (int val: arr) {
            System.out.println(val);
        }
        System.out.println(data[1]);
    }

二维数组,二维数组为一个特殊的一维数组,其每个元素都是一个一维数组。

对象数组

Cat c [] = new Cat[2];
c[0] = new Cat("cat1",3);
c[1] = new Cat("cat2", 3);

数组相关类库 数组排序java.util.Arrays.sort 数组拷贝System.arraycopy

//    可变类型参数
    public static void printArray(int ...args){
        for (int arg:args) {
            System.out.print(arg+",");
        }
        System.out.println("");
    }


int arr1[] = new int[] {1,2,3,4,5,6,7,8,9};
int arr2[] = new int[] {11,22,33,44,55,66,77,88,99};
//源数组,源数组开始点,目标数组,目标数组开始点,长度
System.arraycopy(arr1,3, arr2,3,3);

printArray(arr1);
printArray(arr2);

类关联

类通过引用传递来实现类之间的关联,同时也可以实现与自身的关联。

    public static void main(String[] args) {
        Person p = new Person("nangong", 24);
        Person child1 = new Person("child1", 10);
        Person child2 = new Person("child2", 11);
        child1.setDog(new Dog("1号狗",100));
        child2.setDog(new Dog("2号狗",180));
        Dog dog = new Dog("xiaohuang", 1000);

//        类之间建立联系
        p.setDog(dog);
        dog.setPerson(p);
        p.setChildren(new Person[]{child1, child2} );

        System.out.println(p.getDog().getInfo());
        for (int i = 0; i <p.getChildren().length ; i++) {
            System.out.println("\t|- " + p.getChildren()[i].getInfo());
            System.out.println("\t\t|- " + p.getChildren()[i].getDog().getInfo());
        }
    }

image.png

String类

string类型是不可变的,其底层采用数组来实现,也没有提供修改value数组的方法。 Java1.8以前采用char数组来实现,Java1.9以后采用byte数组来实现。

image.png

String常量是一个匿名对象,栈内存存放的是地址的引用,而不是实际值。 字符串常量与实例化对象比较,字符串常量调用equals方法能够防止空指针异常。 image.png

String类实例化的两种方式结果是不一样的。

直接赋值的方式,会将对象放入字符串常量池中,达到对象复用的效果。 而构造方式会产生两个实例化对象,并且会重新开辟一个堆内存空间,不会引用字符串常量池中的对象。

image.png

字符串常量池

为了达到相同字符串重用的效果,jvm中会单独开辟一块内存用来存放字符串常量,通常适用于字面量创建字符串的方式。 需要解析动态变量,当对应的类或接口被加载时,运行时常量池就会被创建出来。 像下面的代码中string3就因为使用了变量name,所以不能复用字符串常量池,只能放入运行时常量池中。

image.png

字符串不可变性 String本身是不可变的,通过+操作符也只是将地址指向一个新的内存空间,会重新创建一个新的字符串,所以一般在for循环中也不建议用+运算符重载语法糖,这样会产生很多垃圾对象。

image.png

主方法字符串数组参数

main方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数

idea在Run -> Edit Configurations下、配置 可以设置运行参数配置: Program arguments 、Environment variables 和 VM options。

public static void main(String[] args) {
    for (String arg: args){
        System.out.println(arg);
    }
}

image.png

String常用方法

JavaDoc9文档在线链接

字符相关 charAt、toCharArray() 字节相关 getBytes 字符串比较(相等,大小比较) equals、equalsIngoreCase、compareTo(String anotherString)、compareToIgnoreCase() 字符串查找 contains(CharSequence s)判断是否包含子串、indexOf系列方法、startsWith、endsWith 字符串替换 replaceAll(String regex, String replacement)、replaceFirst 字符串拆分 split(String regex, int limit)返回String[],limit拆分指定个数。 字符串截取 substring(int beginIndex, int endIndex),endIndex可选 字符串格式化 format(String format, Object... args) concat(不进入字符串常量池)、intern(字符串入池)、isEmpty()、trim、length、toUpperCase、toLowerCase

IDEA快捷键

删除当前行, 默认是 ctrl + Y 复制当前行, 自己配置 ctrl + d 补全代码 alt + / 添加注释和取消注释 ctrl + / 导入该行需要的类 先配置 auto import , 然后使用 alt+enter 即可 快速格式化代码 ctrl + alt + L类 快速运行程序 ctrl + shift + f10 生成构造器等 alt + insert 查看一个类的层级关系 ctrl + H 将光标放在一个方法上,输入 ctrl + B , 可以定位到方法