java基础知识梳理(标识符、变量、关键字、数据类型_详讲类的引用_clone的浅拷贝与深拷贝)

一、标识符

   通俗说:所有可通过自己命名的都统称为标识符。

   命名规则:

           1)由字母、下划线“_”、$美元符三部分组成,不能以数字开头

           2)  不能与关键字重名,例如:class 、if 、else等

二、Java 变量

  1)局部变量:在方法内或者语句内定义的变量

    特点:只在定义的方法中有用。

  2)成员变量:定义在方法外的变量、有可称为全局变量,在整个类中都有用。

三、Java数据类型

  1)基本数据类型

    分为4类8种,分别是:byte、Boolean、short、int、integer、float、double、char

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

boolean:只有true和false两个取值。

char:16位,存储Unicode码,用单引号赋值。

  2)引用类型

    Java有5种引用类型分别是:类、接口、数组、枚举、标注

数据类型_详讲类的引用_clone的浅拷贝与深拷贝,下面创建一个例子说明类的引用(划重点)

package javaTest;

public class Student implements Cloneable {
    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;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    /*@Override
    public String toString() {
        return "名字:" + name + "年龄" + age;
    }
*/
    public static void main(String[] arg) throws CloneNotSupportedException {
        Student stu = new Student();
        Student stu1 = new Student();
        stu1 = stu;
        System.out.println(stu + "----" + stu1);
        // stu与stu1具有相同的引用地址,地址指向内存中同一个存储位置,也即是同一个值
        // 输出javaTest.Student@15db9742----javaTest.Student@15db9742
        // 使用stu 传值
        stu.setName("张三");
        stu.setAge(11);
        // 使用重写的toString方法打印值,如果不重写默认toString输出的是地址
        System.out.println(stu.toString() + "-----" + stu1);
        // 打印结果:
        /*
         * 名字:null年龄0----名字:null年龄0 //这条打印是上面stu和stu1的,之前没有重写头String
         * 所以打印的是地址,现在重写toString 后打印的是toString返回值, 直接打印类时会默认调用toString方法
         * 
         * 名字:张三年龄11-----名字:张三年龄11
         * //System.out.println(stu.toString()+"-----"+stu1)的输出结果 可以看到stu与stu1输出一样
         **/

        // 现在使用使用stu1改变name
        stu1.setName("小王");
        System.out.println(stu.toString() + "-----" + stu1);

        /*
         * 打印结果如下,可以看见stu\stu1都发生了改变 名字:null年龄0----名字:null年龄0 名字:张三年龄11-----名字:张三年龄11
         * 名字:小王年龄11-----名字:小王年龄11
         * 
         */

        // 总结 new 一个对象时,stu 只是引用变量,指向一个地址,内存地址中才是真正存放的值,
        // 当stu1改变内存中的值时,stu也发生了改变
        // 原因是在第一次new Student时内存中已经创建一个Student对象并分配了内存空间
        // 当再次 new stu1时,Java不会在分配另一个内存空间,而只是把它的地址指向第一次创建的对象时分配的内存空间

        // 可以使用深拷贝来实现互不干扰
        // 需要实现接口cloneable、并重写clone方法,我将在上面代码中直接加入,
        //不重写clone()是浅拷贝
        //浅拷贝只会拷贝到下一层,也就是说会把地址拷贝过去,但是地址指向的内存空间还是同一个,当改变了地址空间的值,也会影响原来的对象,而深拷贝则是完完全全的拷贝,会重写分配内存空间
        //深拷贝
        /*@Override  
        public Student clone() throws CloneNotSupportedException {
            return (Student) super.clone();
        }*/
        //浅拷贝
        /*@Override
        public Student clone() throws CloneNotSupportedException {
            return  super.clone();
        }*/

        Student stuClone = (Student)stu.clone();

        stuClone.setName("666");
        System.out.println(stu.toString() + "-----" + stu1 + "----" + stuClone);
        /*
         * 名字:null年龄0----名字:null年龄0 
         * 名字:张三年龄11-----名字:张三年龄11 
         * 名字:小王年龄11-----名字:小王年龄11
         * 名字:小王年龄11-----名字:小王年龄11----名字:666年龄11
         */
        //原因是在克隆时会重新创建一个Student对象,重新分配地址
        //注掉重写的toString方法,打印地址看看
        System.out.println(stu);
        /*打印结果,可看出stuClone地址不一样
         * javaTest.Student@15db9742----javaTest.Student@15db9742
        javaTest.Student@15db9742-----javaTest.Student@15db9742
        javaTest.Student@15db9742-----javaTest.Student@15db9742
        javaTest.Student@15db9742-----javaTest.Student@15db9742----javaTest.Student@6d06d69c
        javaTest.Student@15db9742*/


    }

}
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值