📄 java入门(8).htm
字号:
……
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 3) 使用javac编译这个类;</P>
<P> 4) 然后我们就可以在其它类中使用这个类。</P>
<P><B> 注意:</B></P>
<P> 当你编译使用自定义类(如Birthday)的程序(如useBirthday.java)时,这个类(Birthday.class)必须与程序(useBirthday.java)位于相同的目录中,或者在系统变量CLASSPATH定义的目录中。否则编译时将找不到这个类,以致程序无法编译成功。</P>
<P><B> 一些提示:</B></P>
<P> 当你需要同时编译几个Java文件时,你可以使用一条命令来完成。例如:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
javac Birthday.java useBirthday.java
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> javac程序将一起编译所有这些文件。我们知道编译useBirthday.java时,需要用到Birthday.class(就是由Birthday.java编译生成的)。那么大家可能会以为,我们一定要将Birthday.java放在前面,以确保能够先编译生成Birthday.class。</P>
<P> 其实并不需要,Java编译器能够智能地处理,你完全可以将useBirthday.java放在Birthday.java前面。</P>
<P> 我们在Birthday类定义中,发现有两个与类Birthday同名的成员方法:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public Birthday()
public Birthday(String y,String m,String d)
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 这种与类同名的成员方法称为构造器。每当使用new操作符创建属于这个类的对象时,就会执行构造器方法。</P>
<P> 一个类可以有多个构造器,在使用new操作符时,执行哪个构造器则取决于它所还的参数。如:</P>
<P> 1)Birthday birthday1=new Birthday();</P>
<P> 在这条语句中,由于调用Birthday方法时,并未有任何参数,所以将调用Birthday类的构造器Birthday()。</P>
<P> 2) Birthday birthday2=new Birthday("1949","10","01");</P>
<P> 而在这条语句中,调用Birthday方法所带的参数与Birthday(String y,String
m,String d)相吻合,所以将调用Birthdya类的构造器Birthday(String y,String
m,String d)。因些,将完成以下赋值工作:</P>
<P> 1)year=y; à year=“1949”</P>
<P> 2)month=m; à month=“10”</P>
<P> 3)day=d; à day=“01”</P>
<P><B> 注意:</B></P>
<P> 如果调用时的参数与所有构造器不吻合,将使Java编译器在编译程序时报错,使得无法编译成功。</P>
<P><B> 自测练习</B></P>
<P> 1) 如果我们定义一个名为car的类,那么存储这个类的源文件名可以是:________。</P>
<P> a. car.class b.任意取名 c.class.java</P>
<P> 2) 一个类中,只能拥有一个构造器方法。_________</P>
<P> a. 不对 b.对</P>
<P> 3) 一个构造器方法的方法名,___________________。</P>
<P> a.与类同相同 b.可以根据需要取名 c.可以有多个不同名的构造器 </P>
<P> 4) 在______________________时,将调用构造器方法。</P>
<P> a.定义一个属于该类的对象 b.调用new操作符</P>
<P> c.打印属于该类的对象信息</P>
<P> 5) 当__________________时,编译使用自定义类的程序时将出错。</P>
<P> a. 自定义类放在系统环境变量PATH(CLASSPATH未指定该目录)指定的目录中 </P>
<P> b.与程序在同一个目录下 c.放在系统环境变量CALSSPATH指定的目录中</P>
<P> 6) 修改useBirthday.java程序中的语句:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
Birthday birthday1=new Birthday();
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 改为使用构造器Birthday(String y,String m,String d),使其结果相同。</P>
<P>
____________________________________________________________________</P>
<P> 7)
编写一个userName类,包含两个成员变量:firstname,lastname;并仿照Birthday类构建两个构造器方法,一个是带参数,一个是不带参数(将它们初始化为firstname,lastname);最后构建一个fullName方法,用来返回全名。</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P>
____________________________________________________________________</P>
<P><B> 练习答案</B></P>
<P> 1)c
在Java语言中,要求存放类的文件必须与类同名,甚至连大小写都要完全一样。而car.class是编译后生成的,存放源文件应该是car.java。</P>
<P> 2)a 不对,在Java的类中,可以定义多个构造器方法。</P>
<P> 3)a 在Java语言中,要求构造器方法名与类名相同。</P>
<P> 4)b 调用new操作符时,才真正创建这个对象,这时调用构造器方法来构造它。这也是构造器名字的来历。</P>
<P> 5)a
Java编译器会在当前目录和CLASSPATH指定的目录中寻找相应的类,而不会在PATH路径中查找。</P>
<P> 6)
这个很简单,因为不带参数的构造器方法为其赋予了值“0000”、“00”和“00”,因此,我们可以使用带参的构造器来实现相同的工作:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
Birthday birthday2=new Birthday(“0000”,”00”,”00”);
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 7)
这里所要的新类很简单,它与我们前面的实例Birthday类十分类似,我们只需要在前面的定义中做一些修改就可以得到了。</P>
<P> 以下就是一个实例:</P>
<P> 源程序:Birthday.java</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public class userName
{
public String firstname;
public String lastname;
public userName()
{
firstname=”firstname”;
lastname=”lastname”;
}
public userName(String first,String last)
{
firstname=first;
lastname=last;
}
public String fullName()
{
String fullname=firstname+” ”+lastname;
return fullname;
}
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P><B> 8.2 说明类的特性</B></P>
<P><B> 8.2.1 private特性</B></P>
<P><B> 实例说明</B></P>
<P> 1.首先,我们输入以下源程序,构建一个People类:</P>
<P> 源程序:People.java</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public class People
{
public String name;
public String sex;
private String age;
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 2.接着使用javac编译这个类:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
c:javastudy> javac People.java
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 3.接下来,我们构建一个使用People类的程序usePeople.java</P>
<P> 源程序:usePeople.java</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public class usePeople
{
public static void main(String argv[])
{
People people1=new People();
people1.name=”Kate”;
people1.sex=”female”;
people1.age=”23”;
System.out.println(“Name:”+people1.name);
System.out.println(“Sex:”+people1.sex);
System.out.println(“Age:”+people1.age);
}
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 3. 执行以下命令,编译usePeople.java:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
c:javastudy> javac usePeople.java
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 这时,编译器将报告错误,编译失败,如下图所示:</P><A
href="Java入门(8).files/8-3.jpg"><IMG alt=8-3
src="Java入门(8).files/8-3.jpg" width=450 border=0></A>
<P><B> 图8-3 编译错误输出</B></P>
<P><B> 传授新知</B></P>
<P> 在上面这个例子中,我们遇到了一个错误:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
Variable age in class People not accessible from class usePeople:
people1.age=”23”; 1 error
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 这个错误信息的中文信息就是:“在语句people1.age=”23”中有一个错误,usePeople类无权访问People类中的变量age。”</P>
<P> 为什么会出现这个错误呢?难道是语句写错了!但是Java编译器并未对相类似的另两条语句报错呀。</P>
<P> 我们一起来看一下,在People这个类的定义:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public String name;
public String sex;
private String age;
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 我们发现,没有报错的两条语句所访问的变量name与sex,在People类中定义时使用了public;而报错的这条语句所访问的变量age在定义时使用的是private。对,区别就在这里。</P>
<P> 英语单词public的意思是:公用的,而private的意思则是:个人的、私有的。噢!People类中的成员变量age与另两个变量name和sex不同,它是私有的。所以usePeople无权访问age这个成员变量。因此,引起了出错。</P>
<P> 在Java语言中,我们可以将类的某些数据、方法声明为private,这样这个数据或方法则仅能够被这个类使用,而不允许其它类使用。</P>
<P> 这样做有什么好处呢?这样可以实现信息隐藏。我们可以将一个类的所有变量都定义为私有的,然后构造一些公用的方法来访问和处理数据。这样就可以有效地实现数据的封装,利用程序设计。</P>
<P><B> 下面我们来看一个这样的例子:</B></P>
<P><B> 实例说明</B></P>
<P> 1.首先,我们输入以下源程序,构建一个新的People类:</P>
<P> 源程序:People.java</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public class People
{
private String name;
private String sex;
private String age;
public People(String n,String s,String a)
{
name=n;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -