1.关于类和对象
关于类和对象, 可以简单的这么理解, 假设你在玩一个游戏, 你要做的第一件事当然是创建角色. 先考虑一个最简单的游戏角色, 首先这个角色有名字, 其次性别, 职业, 只会走路. 那么问题来了, 你要如何创建这个角色呢? 你首先要输入名字, 性别, 职业, 这个用来记录并保存你的信息的一个代码文件, 就可以称为一个类(这么描述不是很准确, 但是新手的话可以暂时这么理解).
那么用来生成角色的这一个代码文件称为类的话, 那么每个角色就都是一个对象了, 每当需要一个对象的时候, 就用类构建一个.
2.类和构建函数
假设你已经弄明白了, 类和对象大致的关系或者云里雾里, 可以看一看接下来的实例, 或许能帮助到你.
首先我们来创建一个Person.java的文件, 在文件中我们声明一个Person的类.
public class Person {
}
怎么样, 很简单吧, 现在这就是一个类了, 我们用class声明了一个Person的类.
那么问题来了, 这个类空空如也, 怎么才能创建对象呢, 也就是说游戏里玩家怎么创建一个角色呢? 这时候就需要一个构建函数, 依旧很简单.
public class Person {
String _name;
//构建函数
public Person (String name){
_name=name;
}
}
我们在这里先声明了一个_name变量, 类型为String, _name就是Person这个类的成员变量了. 这个_name就是相当于玩家的名字, 在构建函数中 Person (String name).
Person是返回的数据类型, 当你使用new Person(String name)的时候,返回一个Person类型的数据, 也就是返回了一个角色. 想想看, 你需要类给你提供对象, 所以这个返回类型就应该是Person, 才能达到你想要的.
(String name)这个是你生成对象带的参数, 就像你创建角色输入了名字. 现在用成员变量_name保存了你输入的名字.
现在你来想一想, 是不是你告诉构建函数一个参数, 然后生成了一个对象, 并且它的成员变量就是你输入的参数? 也就是说生成了一个你自定义名字的角色?
3. 对象及其使用
理解了什么是类, 现在来看看对象, 在刚刚的Person类的构建函数中, 返回值为Person类型.
现在我们在这同级目录下创建另一个类, 先创建一个JavaObject.java文件, 然后声明一个类. 还记得第一个Java程序么, 要想运行一个程序, 一定要有一个main函数作为入口, 同时import刚才创建的Person类, 如何Import一个类.
import JavaObject.Person;
//记得在刚刚的Person.java的最上方加上 package JavaObject;
public class JavaObject{
public static void main(String[] args) {
Person p=new Person("提莫");
}
}
在这里声明一个Person类型的对象, 用new Person(String name)来构建一个对象, 返回的Person类的对象用p来接收. 只有接收了new Person(String name)返回的对象后, 这个p才可以正常使用, 否则的话p只是一个空指针而已, 调用Person类的方法会报错.
4. setter和getter方法
所有的对象式编程, setter和getter方法应该都是适用的, 下面我们就在Person类里写几个Setter方法和getter方法. 首先我们先创建4个成员变量_name, _weapon, _zhiye , _pack; (成员变量的命名可以随意, 但是不要用关键字作为任何变量的名字, 例如你声明一个package就会报错).
package JavaObject;
public class Person {
String _name;
String _weapon;
String _zhiye;
int _pack;
//构建函数
public Person (String name){
_name=name;
}
//set方法
public void setPackage(int pack){
_pack=pack;
}
public void setWeapon(String weapon){
_weapon=weapon;
}
public void setZhiye(String zhiye){
_zhiye=zhiye;
}
//get方法
public String getName(){
return _name;
}
public String getWeapon(){
return _weapon;
}
public String getZhiye(){
return _zhiye;
}
public int getPackage(){
return _pack;
}
//打印函数
public void printPlayerDetail(){
System.out.println("名字:"+_name);
System.out.println("职业:"+_zhiye);
System.out.println("武器:"+_weapon);
System.out.println("背包:"+_pack+"格");
}
}
看着这些个方法, 可以发现setter方法都是public void setWeapon(String weapon){ }这种类型, 很好理解, setter的意思就是设置的意思, 你只是需要设置这个值, 它也会按照你的代码执行, 所以你是不需要返回值的, 但是一定有参数. 就像是角色捡到了一把武器, 肯定是你先知道, 然后才存起来, 你还需要他来告诉你你捡到武器了么?
getter方法都是 public String getWeapon(){ retern _weapon};
现在来看, Getter方法都是无参数, 但是一定有返回值的. 一样的get就是获取的意思, 你只需要获得这个值, 并不需要去告诉他别的东西. 然后函数体里一定要return一个值. 这也是和构建函数的差别, 除了构建函数以外, 函数的修饰符不是void, 就一定要return一个和修饰符对应类型的数据. (至少目前来看笔者接触的代码来看, 这样理解是没问题的, 不做深究).
最后是一个printPlayerDetail()函数是一个打印函数, 打印你设置的信息, 用来验证你的setter函数起了作用.
接下来就是setter和getter函数的使用了.
import JavaObject.Person;
public class JavaObject{
public static void main(String[] args) {
//构建一个p1对象
Person p1=new Person("lemon");
p1.setPackage(30);
p1.setZhiye("长歌");
p1.setWeapon("晴空雪");
p1.printPlayerDetail();
//打印一个换行
System.out.println("\n");
//构建一个p2对象
Person p2=new Person("yaomeng");
p2.setPackage(60);
p2.setZhiye("纯阳");
p2.setWeapon("天道");
p2.printPlayerDetail();
System.out.println("\n");
//使用getter函数
System.out.println(p1.getName()+" vs "+p2.getName());
System.out.println(p1.getZhiye()+" vs "+p2.getZhiye());
System.out.println(p1.getPackage()+" vs "+p2.getPackage());
System.out.println(p1.getWeapon()+" vs "+p2.getWeapon());
//构建一个当前类JavaObject的对象, 但是这里是没有写构建函数的, 但是在Java中哪怕你不写构建函数, 系统也会有一个默认的无参数的构建函数.
JavaObject obj=new JavaObject();
obj.pk(p1,p2);
}
public void pk(Person p1,Person p2){
System.out.println("\n"+p1.getName()+"手执"+p1.getWeapon()+"和拿着"+p2.getWeapon()+"的"+p2.getName()+"在华山之巅打了起来");
}
}
我们来看这一段
Person p1=new Person("lemon");
p1.setPackage(30);
p1.setZhiye("长歌");
p1.setWeapon("晴空雪");
p1.printPlayerDetail();
首先我们构建了一个p1对象, 给他设置了背包, 职业, 武器, 名字(名字是在构建函数中给他设置的), 最后一句是我们刚才的打印函数, 来检测刚刚的setter函数有没有执行成功. 这里我们cmd+b编译, 会发现角色信息已经打印在控制台了.
接下来看这一段
System.out.println(p1.getName()+" vs "+p2.getName());
System.out.println(p1.getZhiye()+" vs "+p2.getZhiye());
System.out.println(p1.getPackage()+" vs "+p2.getPackage());
System.out.println(p1.getWeapon()+" vs "+p2.getWeapon());
可以看到我们多次使用p1.getName()类似的函数, 我们放在打印函数中, 是因为他们都有返回值, 我们直接打印返回值. 意思是p1执行getName()这个函数. ()空括号代表没有参数, 因为我们Person类的getName()这个函数没有参数. 可以看到控制台打印的信息, 我们成功的拿到了之前设置的值.
最后一段, 我用当前类构建了一个当前类的对象obj, 可以看到这里我们没有写构建函数, 但是系统会自动帮我们生成一个没有参数的构建函数. (可以这么理解, 实际上我觉得自己写的构建函数也是重写了父类方法, 不多提了, 后边就知道了).
JavaObject obj=new JavaObject(); obj.pk(p1,p2);
可以看到在main函数之外, 我还写了一个pk(Person p1, Person p2)的函数
public void pk(Person p1,Person p2){
System.out.println("\n"+p1.getName()+"手执"+p1.getWeapon()+"和拿着"+p2.getWeapon()+"的"+p2.getName()+"在华山之巅打了起来");
}
只是个花絮, 这是朋友id, 我们用obj这个对象执行JavaObject类的方法, 传入我们之前声明的p1, p2两个对象作为参数.
obj.pk(p1,p2);
当然这个函数名不一定要用p1,p2, 我们也可以随便起名字, 例如, 我们函数声明为
public void pk(Person aaa1,Person ccc2)
我们执行这个函数, 依旧是用obj.pk(p1,p2); 但是在函数体内的所有p1, p2都要换成aaa1和ccc2
public void pk(Person aaa1,Person ccc2){
System.out.println("\n"+aaa1.getName()+"手执"+aaa1.getWeapon()+"和拿着"+ccc2.getWeapon()+"的"+ccc2.getName()+"在华山之巅打了起来");
}
5. 小结
看到这篇文章的大部分人接触到的语言, 除了c语言是过程式编译, 其他的语言几乎都是对象式编译. 所以很好的理解类和对象式非常重要的, 理解了这个, 后面的很多知识才有学习的能力. 就好比吃饭一样, 理解类和对象就是学会用筷子. 可能有很多地方解释的并不是很具体和准确, 有问题大家可以留言互相讨论.