Java 创建新类二、说明类的特性
<1> private特性
实例说明
1.首先,我们输入以下源程序,构建一个People类:
源程序:People.java
public class People
{
public String name;
public String sex;
private String age;
}
2.接着使用javac编译这个类:
c:javastudy> javac People.java
3.接下来,我们构建一个使用People类的程序usePeople.java
源程序:usePeople.java
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);
}
}
3. 执行以下命令,编译usePeople.java:
c:javastudy> javac usePeople.java
这时,编译器将报告错误,编译失败,遇到了一个错误:
Variable age in class People not accessible from class usePeople:
people1.age=”23”; 1 error
原因在于People这个类的定义:
public String name;
public String sex;
private String age;
可以发现,没有报错的两条语句所访问的变量name与sex,在People类中定义时使用了public;而报错的这条语句所访问的变量age在定义时使用的是private。对,区别就在这里。
英语单词public的意思是:公用的,而private的意思则是:个人的、私有的。噢!People类中的成员变量age与另两个变量name和sex不同,它是私有的。所以usePeople无权访问age这个成员变量。因此,引起了出错。
在Java语言中,可以将类的某些数据、方法声明为private,这样这个数据或方法则仅能够被这个类使用,而不允许其它类使用。
这样做有什么好处呢?这样可以实现信息隐藏。我们可以将一个类的所有变量都定义为私有的,然后构造一些公用的方法来访问和处理数据。这样就可以有效地实现数据的封装,利用程序设计。
实例说明
1.首先,我们输入以下源程序,构建一个新的People类:
源程序:People.java
public class People
{
private String name;
private String sex;
private String age;
public People(String n,String s,String a)
{
name=n;
sex=s;
age=a;
}
public void infoPrint()
{
System.out.println("Name:"+name);
System.out.println("Sex:"+sex);
System.out.println("Age:"+age);
}
}
2.接着使用javac编译这个类:
c:javastudy> javac People.java
3.接下来,我们构建一个使用People类的程序usePeople.java
源程序:usePeople.java
public class usePeople
{
public static void main(String argv[])
{
People people1=new People("Kate","female","23");
people1.infoPrint();
}
}
3. 使用javac编译后,执行以下命令运行程序:
c:javastudy> java usePeople
在这个实例中,People将数据都封装起来,usePeople则使用People类提供的两个公用的(public)方法来设置成员变量的值,以及打印这些成员变量的值。
<2> static特性
实例说明
1.首先,我们构建一个类myBook:
源程序:myBook.java
public class myBook
{
public String bookName;
public static String ownerName=”XuFen”;
public myBook(String bn)
{
bookName=bn;
}
public void infoPrint()
{
System.out.println("Book Name:"+bookName);
System.out.println("Owner:"+ownerName);
}
}
2.接着使用javac编译这个类:
c:javastudy> javac myBook.java
3.接下来,构建一个使用myBook类的程序usemyBook.java
源程序:usemyBook.java
public class usemyBook
{
public static void main(String argv[])
{
myBook mybook1=new myBook("C Progamming");
myBook mybook2=new myBook("Java Programming");
mybook1.infoPrint();
mybook2.infoPrint();
System.out.println("--------------------------------------");
mybook1.bookName="C Programming";
mybook1.ownerName=”XuFeng”;
mybook1.infoPrint();
mybook2.infoPrint();
}
}
4. 使用javac编译后,执行以下命令运行程序:
c:javastudy> java usemyBook
看一下这个程序,以及它所产生的输出:
1)
myBook mybook1=new myBook("C Progamming");
myBook mybook2=new myBook("Java Programming");
mybook1.infoPrint();
mybook2.infoPrint();
在这一段程序中,我们定义了两个myBook类的对象mybook1和mybook2,并且调用它的构造器方法,将其成员变量bookName的值分别设置为“C Progamming”和“Java Programming”。
接下来,调用myBook类的成员方法infoPrint打印它们的信息,程序输出了:
Book name: C Progamming
Owner: XuFen
Book name: Java Programming
Ower: XuFen
我们并没有为ownerName赋值呀,为什么会输出呢?这是因为我们在myBook类的定义中就为其赋值为“XuFen”了。所有每一个myBook类的对象都有这个成员变量了。
由于,我们发现了mybook1的书名与拥用者名字都错了,所以我们又重新修改,再打印出新的信息:
2)
mybook1.bookName="C Programming";
mybook1.ownerName=”XuFeng”;
mybook1.infoPrint();
mybook2.infoPrint();
首先,我们修改了成员变量bookName的值,加上了少掉的字母“r”,接着修改了成员变量ownerName的值,加上了少掉的字母“g”。
接着,再看一下输出:
Book name: C Programming
Owner: XuFeng
Book name: Java Programming
Owner: XuFeng
这时,我们发现mybook1的bookName与ownerName的值就修改过来了。但我们惊奇地发现,mybook2的ownerName也从“XuFen”变成了“XuFeng”。这是怎么回事呢?我们并没有对它做过修改呀!
这时因为,我们定义ownerName时,使用了一个特殊的特性说明符static:
public static String ownerName=”XuFen”;
英文单词static的意思是:静态。也就是说,我们让成员变量ownerName成为静态的变量。这里静态的意思不是指它的值是不变的。而是它的存储位置是不变的。
从上图中,我们可以很清晰地知道,myBook类的两个对象mybook1和mybook2虽然都包含自己的成员变量ownerName,但它们都是指向同一个存储位置的。所以实际上只有一个。
同样的,static也可以用来修饰方法,即静态方法,静态方法只能访问静态数据,而不能访问非静态的变量和方法,否则将引起编译器出错。