您的位置:首页 > 职场人生

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

2014-05-15 11:51 260 查看
---------------------- 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培训、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: