下面我们来讲如何建好类以及如何将它实例化
首先建立一个学生类Student,里面要求有属性,学号、年龄为int型,姓名,方法有学习study
在Student.java文件当中,我们完成以上代码为
public class Student {
int age=17;
int sno=2121;
String name="mike";
String study(){
return name+" is studying";
}
}
上面代码可以实现基本要求,我们通常不会在类当中进行测试,所以我们会在新建测试类,格式为类名后加Test,我们新建StudentTest.java
public class StudentTest {
public static void main(String[] args){
Student stu1 = new Student();
System.out.println(stu1.age);
System.out.println(stu1.sno);
System.out.println(stu1.study());
}
}
我们运行StudentTest.java得到下面的结果
17
2121
mike is studying
对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
通过已创建的对象来访问成员变量和成员方法,如下所示:
/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();
所以说我们可以看到我们通过这一句,Student stu1 = new Student();完成了对学生类的实例化
那这句是如何构成的?首先Student为类名称,stu1为我们自己定义的学生1,new是开辟内存空间,后面的Student()则是构造方法,我们可以类比变量的定义,类的实例化类似于定义一个变量,
int a = 10;
Student stu1 = new Student();
这句话定义了一个变量a并且在内存当中开辟了10的存储空间,int为变量a的类型,Student也同样为对象stu1的类型,等号后面的同样都是对于内存大小的处理,这样理解比较容易。
构造方法
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
在Student.java当中
public Student(){}
这句构造方法其实是隐藏的,所以说我们在测试类当中可以正常使用
那现在有个问题,如果说我们要求定义两个学生,要求不同的属性值,我们的构造方法则显得死板,我们如何实现?
方法的重载
解决方法是创建另一个有相同名字但参数不同的方法,这个过程我们称为方法的重载
public class Student {
int age;
int sno;
String name;
public Student(){}
public Student(String name){
this.name=name;
}
String study(){
return name+" is studying";
}
}
同样的,这里我们也会养成先写一个默认构造方法的习惯,重载的构造方法一定要参数的类型不同或者个数不同。
在测试类当中的调用
public class StudentTest {
public static void main(String[] args){
Student stu1 = new Student();
Student stu2 = new Student("neo");
System.out.println(stu1.study());
System.out.println(stu2.study());
}
}
静态变量
被 static 修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。静态变量可以直接通过类名.静态变量名称调用,虽然也能通过对象来访问静态变量和方法,但为了可读性,方便分辨静态变量,应该通过类名来调用。
静态方法
被 static 修饰的成员方法叫做静态方法,也叫做类方法,静态方法可以直接通过类名.静态方法名称调用(同样也可以用对象.方法的方式),不属于对象的。
同样也有静态常量,这里不做赘述