黑马程序员--Java学习08--对象

本文探讨了ASP.Net与Unity的开发整合、.Net培训内容,并提供了实例讲解对象创建、使用以及引用实体的概念。同时,文章还涉及了参数传递的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

对象

一、定义

      类是创建对象的模板。当时用一个类创建了一个对象时,也就是说给出了这个类的一个实例。

二、创建对象

      创建对象包括对象的声明和为对象分配内存两个步骤。

1、对象的声明

    一般格式为:

    类的名字    对象的名字;

2、为声明的对象分配内存

    使用new运算符和类的构造方法为声明的对象分配内存,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的,构造方法的名字必须和类名相同)。如:

zhangPing = new People();

以下是两个例子:

例1:

class XiyoujiPeople {

	float height,weight;
	String head,ear,hand,foot,mouth;
	void speak(String s){
		System.out.println(s);
	}
}
class A {
	
	public static void main(String[] args){
		XiyoujiPeople zhubajie;//声明对象
		zhubajie= new XiyoujiPeople();//为对象分配内存,使用new 运算符和默认的构造方法
	}
}

例2:

class PointDemo {

	int x,y;
	PointDemo(int a,int b){
		x=a;
		y=b;
	}
}
public class A {

	public static void main(String[] args){
		
		PointDemo p1,p2;         //声明对象p1,p2
		p1=new PointDemo(10,10); //为对象分配内存,使用new 和类中的构造方法
		p2=new PointDemo(12,15); //为对象分配内存,使用new 和类中的构造方法
	}
}

注:如果类中定义了一个或多个构造方法,那么Java不提供默认的构造方法,例2中没有提供不带参数的构造方法,因此,例2中个如下创建对象是非法的:

p1=new PointDemo();

三、使用对象

     对象不仅可以改变自己的变量的状态,而且还拥有了使用创建它的那个类中的方法的能力,对象通过使用这些方法可以产生一定的行为。

     通过使用运算符“.”,对象可以实现对自己的变量访问和方法的调用。

1.对象操作自己的变量(对象的属性)
     对象创建之后就有了自己的变量,即对象的实体。通过使用运算符“.”,对象可以实现自己的变量的访问。

2.对象调用类中的方法(对象的功能)

    对象创建之后,可以使用运算符“.”调用创建它的类中的方法,从而产生一定的行为功能。

    当对象调用类中的一个方法时,方法中的局部变量被分配内存空间,方法执行完毕,局部变量即刻释放内存。局部变量声明时如果没有初始化,就没有默认值,因此在使用局部变量之前,要事先为其赋值。

例:

/**
创建一个XiyoujiPeople类,创建一个zhubajie对象,然后赋值并输出,调用XiyoujiPeople的方法  
    
*/
	 
class ObjectDemo2 {  
     
	 public static void main(String[] args) {  
        // TODO Auto-generated method stub  
         XiyoujiPeople  zhubajie;       //声明对象  
         zhubajie = new XiyoujiPeople();  //为对象分配内存,使用new运算符和默认的构造方法  
         zhubajie.ear = "又肥又大";      //为XiyoujiPeople的ear成员变量赋初值  
         zhubajie.head = "是一个猪头";    //为XiyoujiPeople的head成员变量赋初值  
         zhubajie.mouth = "有一张猪嘴";   //为XiyoujiPeople的mouth成员变量赋初值  
         zhubajie.height = 1.6f;        //为XiyoujiPeople的height成员变量赋初值  
         zhubajie.weight = 500;          //为XiyoujiPeople的weight成员变量赋初值  
         zhubajie.speak("大家好!我是猪八戒");  //调用XiyoujiPeople的speak方法  
         System.out.println("我" + zhubajie.mouth );  //输出之前赋的值  
         System.out.println("我" + zhubajie.head);  
         System.out.println("我的耳朵" + zhubajie.ear);  
         System.out.println("我的身高只有" + zhubajie.height + "米");  
         System.out.println("但我却有" + zhubajie.weight + "公斤重");  
    }  
}  
  
class XiyoujiPeople {  
    float height;    //定义变量  
    int weight;  
    String head, ear, hand, foot, mouth;  
    void speak (String s) {     //定义speak方法  
        System.out.println(s);  
    }  
}  

输出结果为:

四、对象的引用和实体

    当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称为该对象的实体,而对象中存放着引用,以确保实体由该对象操作使用。

    以上面例2中的PointDemo类为例,其中创建了两个对象:

PointDemo p1=new PointDemo(12,16);PointDemo p2 =new PointDemo(6,18);

内存模式如下图:


假如在程序中使用了下述的赋值语句:

p1=p2;

把p2的引用赋给了p1,因此p1和p2本质是一样的了。虽然在源文件中p1、p2是两个名字,但是在系统看来他们的名字是一个:0xDD。系统将取消原来分配给p1的内存,即释放分配给p1的变量。这时如果输出p1.x的结果将是6,而不是12,内存模式如下图:


       因此,如果一个类创建的两个对象具有相同的引用,那么就具有完全相同的实体。没有实体的对象称为空对象,空对象不能使用,即不能让~个空对象去调用方法产生行为。假如程序中使用了空对象,程序在运行时会出现异常:NuIIPointerException o由于对象是动态地分配实体,所以Java昀编译器对空对象不做检查。因此,在编写程序时要避免使用空对象。 


五、参数传值

       当方法被调用时,如果力.法有参数,参数必须要实例化,即参数变量必须有具体的值。在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者定的值的副本。例如,如果向方法的int型参数x传递一个int值,那么参数x得到的值是传递值的副本。方法如果改变参数的值,不会影响向参数“传值”的变量的值。
      1.基本数据类型参数的传值
      对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别,比如,不可以向int型参数传递一个float值,但可以向double型参数传递一个float值。
      2.引用类型参数的传值
     Java的引用型数据包括对象、数组以及接口。当参数是引用类型时,“传值”传递的变量的引用而不是变量所引用的实体。
     如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化,因为,两个同类型的引用型变量如果具有同样的引用,就会用同样的实体。但是,改变参数的引用不会影响向其传值的变量的引用,如下图所示:

例:

class People {
	int money;
	void setMoney(int n) {
	
		money=n;
	}
}
class A {
	void f(double y,People p) {
	
		y=y+1;
		p.setMoney(100);
		System.out.println("参数y的值是:"+y);
		System.out.println("参数对象p的money是:"+p.money);
	}
}
public class ObjectDemo2 {

	public static void main(String[] args) {
	
		double y = 0.8;
		People zhang =new People();
		zhang.setMoney(8888);
		A a =new A();
		System.out.println("在方法f被调用之前对象zhang的money是:"+zhang.money+"y的值是:"+y);
		a.f(y,zhang);
		System.out.println("在方法f被调用之后main方法中y的值仍然是:"+y);
		System.out.println("在方法f被调用之后对象zhang的money是:"+zhang.money);
	}
}

输出结果为:






---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值