组团学

对象的使用方式

阅读 (877680)

1、对象存储

对象的存储是在内存中有地址与值,那么地址与值是使用栈与堆的形式存储。

1.1、案例

需求:生成一个人的对象

Person p1=new Person();

wpsxKxHgG.jpg

当我们声明完p1对象后,在内存栈中,我们可以查看到p1的地址,在内存堆中,我们可以看到我们类中的属性与方法。在使用对象时,我们是先找到对象的栈地址,在找到堆中的实际内容。

1.2、基本数据类型

需求:定义一个整型变量

int a=100;

wpso852DY.jpg

当我们声明变量a时,只是在内存栈中开辟了一个直接存放内容的空间。

1.3、引用数据类型

需求:定义一个人类对象,并初始化

Person p=new Person(); p.name="小明"; p.sex="boy";

wpsVr3Vu6.jpg

当我们声明p对象时,在我们的内存栈中,我们存入了对象的地址,而这个地址,指向的是我们内存堆中的实际属性,name和sex,也就是说,我们通过内存栈中的地址也就是对象,可以找到内存堆中的name和sex这二个属性的值“小明”和“boy”

2、对象使用

创建新的对象之后,我们就可以使用“ 对象名.对象成员 ”的格式,来访问对象的成员(包括属性和方法)。

2.1、案例

public class Person{ int age=23; public void shout(){ System.out.println(age); } }
public class PersonDemo{ public static void main(String[] args){ Person p1 = new Person(); Person p2 =new Person(); p1.age = -30; //不同的对象打印,不同的值 p1.shout(); p2.shout(); } }

运行结果:

image20191216142157023.png

在我们的主函数里,声明了p1,p2二个对象,p1,p2对象分别在我们的内存中开辟了二个不同的空间,那么当p1中的属性age发生变化的时候,p2里面的age是不会受到影响的。那么最后调用shout()方法的时候,我们输出的结果是p1的age是-30和p2的age是23。

2.2、对象创建

格式:

类名 对象名称 = null; //声明对象

对象名称 = new 类名(); //实例化对象

案例:

public class Person { String name; //声明姓名属性 int age; //声明年龄属性 public void tell() //取得信息的方法 { System.out.println("姓名:" + name + ",年龄:" + age); } }
public class PesronDemo { public static void main(String[] args) { Person per = new person(); //创建并实例化对象 } }

2.3、属性与方法的访问

格式:

**访问属性:**对象名称.属性名

**访问方法:**对象名称.方法名()

public class Person { String name; //声明姓名属性 int age; //声明年龄属性 public void tell() //取得信息的方法 { System.out.println("姓名:" + name + ",年龄:" + age); } }
public class PersonDemo { public static void main(String args[]) { Person per = new Person(); //创建并实例化对象(非常重要) per.name = "张三"; //为name属性赋值 per.age = 30; //为age属性赋值 per.tell(); //调用类中的方法 } }

3、对象的生命周期

3.1、程序结束时,所有对象都回收

wpsszi6G7.jpg

产生了一个p1对象,当整个程序结束执行时,p1对象变成了垃圾,结束了他的生命周期。

3.2、当对象为null时,对象变成垃圾

wpsawXiED.jpg

产生了一个p1对象,在程序的运行过程当中,p1赋值了null,那么p1在内存栈中的地址就消失了,失去了地址的对象就变成了垃圾,等待着JVM的垃圾回收。

wpsWqEXfB.jpg

产生了一个p1对象,将p1对象的地址给了p2,表示的是p1和p2同时拥有了同一个地址,他们同时指向了我们内存堆中的内容,当我们把p1的地址赋值为null时,p2是不受影响的,所以,p1变成了垃圾对象,而p2还是可以正常使用。

4、对象的比较

4.1、==运算符

“= =”运算符 ,用于比较两个变量(基本数据类型和引用数据类型变量)的值是否相等。

public class ObjectDemo01{ public static void main(String args[]){ String s1=new String("abc");//产生字符串对象 String s2=new String("abc"); String s3=s1;//将s1的地址给了s3所以他二地址一样 if(s1==s2){//比较具体的地址 System.out.println("s1==s2"); }else{ System.out.println("s1!=s2"); } if(s1==s3){ System.out.println("s1==s3"); }else{ System.out.println("s1!=s3"); } } }

运行结果:

image20191216142834237.png

4.2、equals()方法

equals()方法是String 类的一个成员方法,用于比较两个引用变量所指向的对象的内容是否相等。

public class ObjectDemo02{ public static void main(String args[]){ String s1=new String("abc"); String s2=new String("abc"); String s3=s1; if(s1.equals(s2)){//比较具体的值 System.out.println("s1==s2"); }else{ System.out.println("s1!=s2"); } if(s1.equals(s3)){ System.out.println("s1==s3"); }else{ System.out.println("s1!=s3"); } } }

运行结果:

image20191216142928258.png

5、匿名对象

创建完对象后,在调用该对象的方法时,可以不定义对象的引用变量,而直接调用这个对象的方法。这样的对象叫匿名对象。

5.1、匿名对象定义

**格式:**new 类名()

5.2、匿名对象使用

5.2.1、作为实参传递

将匿名对象作为实参传递给一个函数调用。

**需求:**比如程序中有一个getSomeOne 函数,要接收一个Person类对象作为参数,函数定义如下:

public static void getSomeOne(Person p){ ... } 函数调用: getSomeOne(new Person());

5.2.2、方法只用一次

如果一个对象只需要一次方法调用,那么就可以使用匿名对象。

需求:比如类Person中有一个shout函数,要求只调用一次

new Person().shout();

5.2.3、案例

需求:将小汽车改装成3个轮子的黑车。

1、汽车类

2、汽车修理厂

/* 匿名对象 汽车类 改车厂类 把汽车的改成黑色3轮车。 */ //汽车类 public class Car { String name = "smart"; //名字 String color = "red"; //颜色 int num = 4; //轮胎数量 public void run() { System.out.println(name + ":" + color + ":" + num + ":跑起来了。。。。"); } }
//改车工厂 public class BlackCarFactory { String name; //工厂名字 String addr; //工厂地址 public Car repairCar(Car c) { //将车改成黑色,3轮 c.num = 3; c.color = "黑色"; System.out.println("改装成功啦。。。"); return c; } }
public class CarDemo{ public static void main(String[] args) { BlackCarFactory bcf = new BlackCarFactory(); //产生一个改车工厂对象 bcf.name = "幸福修理厂"; bcf.addr = "天河区棠东东路御富科贸园a栋206"; // 非匿名对象 Car c = new Car(); //产生一汽车对象 c.run(); //运行起来 // 跑到改车工厂,将车传入,进行改装 bcf.repairCar(c); // 改装完成,取车,在运行 c.run(); System.out.println("--------------------"); // 匿名对象一,只使用一次: // 如下创建了2个对象 new Car().run(); new Car().run(); System.out.println("--------------------"); // 匿名对象二,作为实际参数传递 Car c2 = bcf.repairCar(new Car()); //直接将车送进改装工厂 c2.run(); //改装完后运行 System.out.println(); } }

运行结果:

image20191216143427038.png

需要 登录 才可以提问哦