Java学习笔记(2.4)

一、类的定义

1.1语法结构:

【修饰符列表】 class 类名{

属性;

方法;}

*属性:描述对象的状态信息,通常采用一个变量的显示来完成定义。成员变量没有赋值,系统赋默认值,一切向0看齐。

例:int age;

*方法:描述的是对象的动作信息

*对象又被称为实例,实例变量又被称为对象变量。

二、对象的创建

 

        关键字:new,一种运算符,用于创建对象并在jvm的堆内存中为该对象开辟新的内存空间。

        语法结构:类名 对象名=new 类名(可选的参数);

        ——对象所占用的内存是在堆内存中分配的,通过该语句,一个类可以实例化n个对象。

三、引用类型变量使用

 

        引用数据类型和基本数据类型身份是相当的,不用进行特殊化的处理,统一看作”数据类型“处理。

        所以引用数据类型变量的定义是可以在类体中充当实例变量的,这种定义的方式可以有效地交代各实体之间的复杂关系。相对的关系之间也更加的直观,更加的容易理解。

四、常见错误

    空指针的异常:

Exception in thread "main" java.lang.NullPointerException

    at test04.main(test04.java:7)

进程已结束,退出代码为 1

 

总的来说,当空的引用访问实例相关的数据时,一定会产生空指针异常,其中实例相关的数据,指的就是如果要访问该信息时,一定要通过对象进行访问,才可以正常的访问到正确的信息。在引用时,注意这种嵌套关系,认真一些。

五、自定义构造方法

        创建实例的时候,经常需要同时初始化这个实例的字段,这时就需要构造方法。

class Person {

    private String name;

    private int age;

    

    public Person(String name, int age) {   // 定义构造方法

        this.name = name;

        thsiage = age;    

    }

    

    public String getName() {

        return this.name;    

    }

    

    public int getAge() {

        return this.age;    

    }

}

Person p = new Person("Xiao Kang", 18);

System.out.println(p.getName());

System.out.println(p.getAge())

创建实例的时候,实际上是通过构造方法来初始化实例的,定义一个构造方法能在创建Person实例的时候,一次性传入name和age完成初始化。

        由于构造方法是如此特殊,所以构造方法的名称就是类名。构造方法的参数没有限制,在方法内部可以编写任意语句。但是,和普通方法相比,构造方法没有返回值也没有void,调用构造方法,必须用new操作符。

六、默认构造方法        

        任何class都是有构造方法的,如果一个类没有定义构造方法,编译器会自动生成一个默认构造方法,它没有参数也没有执行语句,类似于如下:

class Person {

    public Person() {            

    }

}

需要特别注意,如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法。

        如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来,如下:

class Person {

    ... ...

    

    public Person() {            // 不带参数构造方法

    }

    

    public Person(String name, int age) {   // 带参数构造方法

        this.name = name;

        thsiage = age;    

    }

    

    ... ... 

}

没有在构造方法中初始化字段时,引用类型的字段默认值是null,数值int类型默认值为0,布尔类型默认值是false。

七、多构造方法

 

        可以定义多个构造方法,在通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分。

class Person {

    private String name;

    private int age;

    

    public Person(String name, int age){  // 数构造方法 2个参数

        this.name = name;

        this.age = age;    

    }

    

    public Person(String name){ // 数构造方法 1个参数

        this.name = name;

        this.age = 12;    

    }

    

    public Person(){     // 构造方法 无参数

    }

}

创建实例调用"new Person("Xiao Kang", 20);",会自动匹配到构造方法"public Person(String name, int age)";创建实例调用"new Person("Xiao Kang");",会自动匹配到构造方法"public Person(String name)";创建实例调用"new Person( );",会自动匹配到构造方法"public Person( )"。

八、总结

 

        实例在创建时通过new操作符会调用其对应的构造方法,构造方法用于初始化实例。

        没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法。

        可以定义多个构造方法,编译器根据参数自动判断。

        可以在一个构造方法内部调用另一个构造方法,便于代码复用。

九、参数传递

Java中的参数传递:分为值传递和引用传递

但本质上,Java中只有值传递。引用传递,其实可以理解为传的是类似指针的东西。

值传递就是把基本变量的值拷贝一份,传递这个拷贝。引用传递则是传递的引用的地址,也就是该变量在内存空间的地址。

 

十、值传递

只有基本数据类型采用值传递,特点是传递的是值的拷贝,传递完后两者就没有关系了。也就是说方法内和方法外的值互不相干

注:8种基本数据类型以外的数据类型都为引用类型。

 

十一、引用传递

指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

传递的是一个拷贝,即副本。也就是说,对于一个参数传递,存在两个地址指向同一个内存空间。这里我们可以用内存分配示意图来体现

 

十二、String类型传递

先说结论,String类型传递与基本数据类型的传递效果相似。

说明:

String类对象一旦创建,其内容不可更改:

String类的所有方法都不会改变String类对象内容,要改变String类对象的值就必须创建一个新的String对象。

也就是说,当进行参数传递时,如果方法内对String类对象的值进行了修改,那么实际上是创建了一个新的String类对象,然后让原来的变量指向它而已。但是这个“原来的变量”是一份拷贝副本,只是一开始创建的时候与主方法中的传递的值相同而已,现在改变之后,两者就毫无关系了。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值