JAVA中的类(class)(二)
Java通过类来创造对象,在Java语法中,对象是一个指针,指向对象属性在堆中的地址。
但对象不仅拥有属性,也包含方法,那么类中的方法又是怎样在计算机中执行,我们又该怎样编写和调用这些方法呢?
类->方法(方法)
class Cat{
int age;
String food;
void eat(){
System.out.printf("The Cat is eating!");
}
}
如上,定义了一个Cat类,Cat类中,包含一个属性i,以及一个f()方法,我们可以使用这个Cat类去创造一个对象,如下:
Cat Tim = new Cat();
即为创造了一个Cat类的Tim对象。如下:
创造Tim对象时,除了在堆内存中分配年龄age和food两个属性外,还而外分配了一块内存用于存放方法eat();
当使用Cat类创建两个对象时,两个对象的属性(age、food)按照各自指针指向分别得两块对内存,而二者的非静态方法指向同一块内存。即:相同类的对象,共用堆内存中同一个非静态方法。如下:
虽然二者指向同一个方法,但两个对象执行该方法时,不会同时执行而是先后调用执行。
虽然在前面反复提到指针,但其实在Java语法中是没有所谓指针概念的,这里的指针都是一些底层操作,在语法层面,已经对Java程序员进行了屏蔽,我们将不会在Java程序中使用到指针。
类的访问
public class CatStory(){
public static void main(String[] args){
Cat Tim = new Cat();
Tim.age = 3; //修改Tim对象的i属性
System.out.printf(" %d\n", Tim.age);//访问Tim对象的i
Tim.eat(); //调用Tim对象中的eat()方法
}
}
使用英文的句点可以访问对象的内部成员,包括Tim内部的属性和方法。运行结果如下(要在前面加上Cat类蛤!)
访问控制符
在前面的程序中时常能在主函数所在类中看到这样一个关键字:public。
public是Java中的一类关键字——访问控制符。前面说过Java的基本单位是类,访问控制符就是对于类当中的成员是否可被访问的修饰符。访问修饰符共有三类,分别是:
- public,公有型访问修饰符。
- private,私有型访问修饰符。
- protected,保护型访问修饰符。
这三种访问修饰符对于访问权限的控制如何呢?我们可以编写如下代码进行测试;
/*Test.java*/
Class A{ //随手定义一个A类
public int i = 10;
private int j = 20;
protected int k = 30;
//随手定义三个变量,访问修饰符分别为public,private,protected
}
public class Test{
public static void main(String[] args){
A aa = new A(); //创造一个A类的对象aa
/*尝试对aa的属性i,j,k进行访问*/
aa.i = 11;
aa.j = 22; //ε=ε=(√≥∨≤)√尝试访问私有的成员
aa.k = 33;
}
}
/*
编译结果为:The field A.j is not visible
at Test.main(Test.java:12)
(/TдT)/访问private成员失败
*/
这说明私有(private)的属性不能被外部被引用、访问,而public和protected的属性可以被访问。
上面访问的是属性,如果使用访问修饰符修饰方法,也能达到相同的效果。private的方法不能被外部访问,而public和protected。
访问控制符private似乎可以阻止我们调用访问,但这是相对于类内部和外部而言。对于类的内部而言,所以成员相互之间都是可以调用的。
class A{ //日常随手A类
public int i;
private int j;
protected int k;
public void show()
{
System.out.printf("i = %d, j = %d, k = %d\n", i, j, k);
//因为是在类的内部,你可以调用任何权限的变量
}
protected void f()
{
g(); //你甚至可以调用私有的方法(☆∪☆)
System.out.printf("FFFF\n");
}
private void g()
{
f(); //递归嵌套,无限循环,哈哈哈(≥△≤)
System.out.printf("GGGG\n");
}
}