类
类“class”是Java语言的核心,Java的一切类型都是类,所有语句都必须位于类内,Java类库包含大量解决问题(字段),和行为(方法)。对象是基于类的具体实体,有时称为类的实例。
类和对象
类与对象的关系类似于车型设计和具体的车。车型设计(类)描述了该车型所具备的属性和功能,但车型的设计并不是具体的车,不能发动和驾驶。相应型号的车(对象),则是根据车型设计制造出的车(类的实例),他们都具备该车型设计所描述的属性和功能,可以发动和驾驶。
类的声明
声明一个类就是创建一个新的数据类型,而类在Java中属于引用数据类型。Java中使用关键字 class 来声明类,后面加上自定义的类名即可。如这里定义的person类,使用class person定义了一个person类,然后在person这个类的类体里面定义person这个类应该具有的成员变量(即属性)和方法,如这里定义的String name和int age这个两个成员变量,或者叫属性,这个name表示这个人的名字,人应该具有这个属性,age表示人的年龄,这也是人应该具有的。这样就在person这个类里面定义了两个人应该有的属性,接下来就是定义方法了。
每个类都要有构造方法,如果不写构造方法,系统会自动生成一个无参的构造方法。. 一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。构造方法无返回值。
下面将实际操作,声明一个Person类,该类定义了两个数据成员(一个public ,一个Protected),一个不带参数的构造函数,一个带参数的构造函数。
/**
* 描述:Person类
*
* @Author administrator{GINO ZHANG}
* @Date2018/11/12
*/
public class Person {
public String name; //姓名(public)
protected int age; //年龄(protected)
public Person(){ //不带参数的构造方法
this.name = "未知";
this.age = 0;
}
public Person(String name,int age){ //两个带参数的构造方法
this.name = name;
this.age = age;
}
public void print(){ //输出人员信息
System.out.printf("name = %s,age = %d\n",this.name,this.age);
}
public static void main(String[] args) {
Person p1 = new Person("jiaruo",3);
Person p2 = new Person("pangzi",4);
p1.print();
p2.print();
}
}
打印结果
C:\java\java7\jdk1.7.0_80\bin\java.exe -javaagent:D:\ideaIU-2018.1.5.win\lib\idea_rt.jar=30705:D:\ideaIU-2018.1.5.win\bin
name = jiaruo,age = 3
name = pangzi,age = 4
Process finished with exit code 0
下面是在main方法里面调用person构造方法时的内存分析情况:
当方法调用完成之后,栈里面为它分配的空间全部都要消失,即把这个方法调用时分配给它的内存空间释放出来,所以这个构造方法person调用完成之后,栈内存里面分配的两小块内存_id和_age自动消失了。这样就把它们所占的空间让了出来,让其他的方法去占用。而new出来的对象则永远留在了堆内存里面。
类的成员
1.数据成员
数据成员用来描述该类的状态,包括字段和常量。数据成员可以是静态成员,与整个类有关;或是示例数据,类的每个实例都有自己的实例副本。
字段是与类相关的变量,常量是与类相关的常量。
2.函数成员
函数成员用于提供操作类中的数据中的某些功能,包括方法和构造方法。
方法时与某个类相关的函数,可以是实例方法,也可以是静态方法。实例方法用来处理类的某个实例,静态方法提供更一般的功能,不需要实例就能直接调用。
构造方法时与类名相同的方法,当类被实例时,首先执行的是构造方法。
3.静态成员和实例成员
类的成员,或是静态成员,或是实例成员。一般而言,静态成员属于类,又称类成员,被这个类的所有实例所共享;而实例成员属于对象(类的实例),每一一个对象都有实例成员的不同副本。当类成员声明中含有static修饰符,它声明为静态成员,否则为实例成员。
代码演示静态成员和实例成员的使用:
/**
* 描述:静态成员和实例成员的使用演示
*
* @Author administrator{GINO ZHANG}
* @Date2018/11/14
*/
class MainCounter{
public int id; //实例字段
public static int count = 0; //静态字段
public MainCounter(int id){ //构造方法
this.id = id;
}
public void countup(){ //实例方法
count++; //正确:实例方法内可以直接使用静态字段
}
public void showInstance(){
System.out.println("Object :"+id); //正确:实例方法可以直接引用实例字段
System.out.println("count :"+count); //正确:实例方法内可以直接引用静态字段
}
public static void showStatic(){
//System.out.println("Object:"+id); 错误:静态方法内不能直接引用实例
System.out.println("count :"+count); //正确:静态方法内可以直接使用静态字段
}
}
public class Counter {
public static void main(String[] args) {
MainCounter m1 = new MainCounter(1); //创建对象
m1.countup(); //对象可以调用实例方法
m1.showInstance(); //对象可以调用实例方法
//m1.showStatic() //对象不可以调用静态方法
System.out.println("Object :"+m1.id); //对象可以调用实例字段
//System.out.println("Object :"+MainCounter.id); 不能用类名调用实例字段
//System.out.println("count :"+m1.count); 不能用对象名调用静态字段
MainCounter.showStatic(); //类名可以调用静态方法
//MainCounter.showIntance(); 类名不可以调用实例方法
}
}