类是某一类事务的共同点的抽象概念,而对象描述的是一个具体的产物。
类一般会有2个组成部分
定义个简单的类
/** * 类:人 */ public class Person { 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; } public void tell() { System.out.println("i am " + name + "and my age is " + age); } }
在java中,类是属于引用数据类型(非基本数据类型),引用数据类型的掌握难在于要对内存进行管理。
内存空间分为:
引用数据类型也意味着多个栈内存可以指向同一个堆内存,每个栈内存也可以更改指向。
思考如下代码
package com.base.demo; public class JavaRamDemo { public static void main(String[] args) { Person p1 = new Person(); p1.setName("p1"); p1.setAge(22); changeName(p1.getName()); p1.tell();// i am p1 and my age is 22 changeName(p1); p1.tell();// i am scott and my age is 22 } public static void changeName(String name) { name = "scott"; } public static void changeName(Person p) { p.setName("scott"); } }
为什么都是修改name,但是只有参数为Person的方法起了作用?
因为Java中,方法的参数是对象时,进行了引用传递。而如果方法的入参是基本数据类型时,进行的时值传递。
新建如下方法
public static void changeNameForNewPerson(Person p) { p.setName("smith"); p = new Person(); p.setName("new smith"); }
然后再进行调用
changeNameForNewPerson(p1); p1.tell();//i am smith and my age is 22
为什么此时输出的姓名不是“new smith”?
此时是由于函数中使用new关键字开辟了一个新的内存空间,那么此时形参的内存地址指向便更改了,所以再对其进行操作便不会影响之前传入的实参的值。