对象的创建和使用
通常情况下,一个类不能直接使用,需要根据类创建一个对象才能使用。
对象使用步骤:
- 导包:
格式:import [包名称],[类名称];
对于和当前类同属一个包下,可以省略导包语句不写。 - 创建:
格式:[类名称] [对象名称] = new [类名称]();
- 使用:
使用成员变量格式:[对象名].[成员变量名];
使用成员方法格式:[对象名].[成员方法名]([参数]);
举例1:对象的使用,和Student
类位于同一个包下。(导包语句可以省略,成员变量不是Public
也可以使用)
package cn.test01; //和Student类位于同一个包下。
public class Test {
public static void main(String[] args) {
//1、导包
//因为和Student都位于cn.test01;这个包下
//2、创建对象
Student stu=new Student();
//3、成员变量使用
System.out.println(stu.name);
System.out.println(stu.age);
stu.name = "张三";
stu.age = 18;
System.out.println(stu.name);
System.out.println(stu.age);
//4、成员方法使用
stu.eat();
stu.sleep();
stu.study();
}
}
package cn.test01;
/*
定义一个类,模拟学生
属性:姓名、年龄
行为:吃饭、睡觉、学习
*/
public class Student {
String name;
int age;
public void eat(){
System.out.println("吃饭!");
}
public void sleep(){
System.out.println("睡觉!");
}
public void study(){
System.out.println("学习!");
}
}
举例2:对象的使用,和Student
类位于不同个包下。(导包语句不可以省略,成员变量是Public
才可以使用)
package cn.test01;
import cn.test02.Phone;
public class Test {
public static void main(String[] args) {
//根据Phone类创建对象pho
Phone pho = new Phone();
System.out.println(pho.brand); //null
System.out.println(pho.price); //0.0
System.out.println(pho.color); //null
pho.brand = "华为";
pho.price = 3888;
pho.color = "白色";
pho.call("任正非");
pho.sendMessage();
System.out.println(pho.brand); //华为
System.out.println(pho.price); //3888
System.out.println(pho.color); //白色
}
}
package cn.test02;
/*
定义一个类,用来模拟手机。
成员变量:品牌、价格、颜色
成员方法:打电话、群发短信
*/
public class Phone {
//成员变量
public String brand; //品牌
public double price; //价格
public String color; //颜色
//成员方法
//打电话
public void call(String who){
System.out.println("给"+who+"打电话!");
}
//群发消息
public void sendMessage(){
System.out.println("群发短信!");
}
}
举例3:对象类型作为方法的参数。
package cn.test01;
import cn.test02.Phone;
public class Test {
public static void main(String[] args) {
//根据Phone类创建对象pho
Phone pho = new Phone();
pho.brand = "华为";
pho.price = 3888;
pho.color = "白色";
method(pho); //传递进去的参数其实是地址值。
}
public static void method(Phone ph){
ph.call("任正非");
ph.sendMessage();
System.out.println(ph.brand); //华为
System.out.println(ph.price); //3888
System.out.println(ph.color); //白色
}
}
package cn.test02;
/*
定义一个类,用来模拟手机。
成员变量:品牌、价格、颜色
成员方法:打电话、群发短信
*/
public class Phone {
//成员变量
public String brand; //品牌
public double price; //价格
public String color; //颜色
//成员方法
//打电话
public void call(String who){
System.out.println("给"+who+"打电话!");
}
//群发消息
public void sendMessage(){
System.out.println("群发短信!");
}
}
举例4:对象类型作为方法的返回值。
package cn.test01;
import cn.test02.Phone;
public class Test {
public static void main(String[] args) {
//根据Phone类创建对象pho
Phone ph = method();
ph.call("任正非");
ph.sendMessage();
System.out.println(ph.brand); //华为
System.out.println(ph.price); //3888
System.out.println(ph.color); //白色
}
public static Phone method(){
Phone pho = new Phone();
pho.brand = "华为";
pho.price = 3888;
pho.color = "白色";
return pho;
}
}
package cn.test02;
/*
定义一个类,用来模拟手机。
成员变量:品牌、价格、颜色
成员方法:打电话、群发短信
*/
public class Phone {
//成员变量
public String brand; //品牌
public double price; //价格
public String color; //颜色
//成员方法
//打电话
public void call(String who){
System.out.println("给"+who+"打电话!");
}
//群发消息
public void sendMessage(){
System.out.println("群发短信!");
}
}
举例5:匿名对象
package cn.test01;
public class Test {
public static void main(String[] args) {
//匿名对象
new Person().sayHello("张三");
}
}
package cn.test01;
public class Person {
String name = "李四"; //姓名
public void sayHello(String name) {
System.out.println("你好"+name+",我是"+this.name+"。");
}
}
举例6:匿名对象作为方法的参数。
package cn.test01;
public class Test {
public static void main(String[] args) {
sayHello(new Person().name);
}
public static void sayHello(String name) {
System.out.println("你好"+name);
}
}
package cn.test01;
public class Person {
String name = "张三"; //姓名
}
根据上述代码描述代码内存中运行的状态:
- 代码在运行前进行编译,编译成的
Test.class
和Phone.class
文件存放在方法区(method Area),包括其中的成员变量和成员方法等。 - 然后代码运行,先将带有
main()
方法的.class
文件进栈(Stack),第一条语句根据Phone
类创建pho
,首先在栈中创建Phone
类型的变量pho
,再将new
出来对象Phone()
的放入堆(Heap)中,包括里面的成员变量,并附上初值,也包括成员方法在方法区的首地址。 - 再将创建好的对象首地址放入左侧创建好的变量当中,第一条语句执行完成。
- 第二条语句,打印
pho
对象中的brand
变量值,首先根据在栈中存储的Phone
类型的变量pho
中存储的地址找到在堆中存储的对象中brand变量,然后将里面的数据打印出来。 pho.brand = "华为";
语句,首先根据对象名称中存储的地址找到在堆中的对象中brand
变量,将"华为"字符串赋值给它。pho.call("任正非");
语句,首先根据对象变量中存储的地址找到堆中的对象,再找到里面的call
方法地址,根据地址在方法区找到该方法,该方法进栈(压栈)。运行完之后出栈。继续main
方法。main
方法在栈中运行到最后,main
方法出栈,内存清空,程序停止。- 如果同时创建的是两个对象,会在堆中重新
new
一个对象,方法区不变。两个对象各管各的。 - 如果将
Phone
类型的pho
中存储的对象地址值,赋值给另一个Phone
类型的变量,那么两个变量同时使用一个对象。 - 对象类型作为方法的参数时,传递的参其实就是对象的地址。对象类型作为返回值同理。
- 不同的包中可以定义相同名称的类。
- 匿名对象只能唯一使用一次,下次在使用不得不创建一个新的对象,如果对象只使用一次建议使用匿名对象。