关于类和对象, 可以简单的这么理解, 假设你在玩一个游戏, 你要做的第一件事当然是创建角色. 先考虑一个最简单的游戏角色, 首先这个角色有名字, 其次性别, 职业, 只会走路. 那么问题来了, 你要如何创建这个角色呢? 你首先要输入名字, 性别, 职业, 这个用来记录并保存你的信息的一个代码文件, 就可以称为一个类(这么描述不是很准确, 但是新手的话可以暂时这么理解). 那么用来生成角色的这一个代码文件称为类的话, 那么每个角色就都是一个对象了, 每当需要一个对象的时候, 就用类构建一个.
假设你已经弄明白了, 类和对象大致的关系或者云里雾里, 可以看一看接下来的实例, 或许能帮助到你.
首先我们来创建一个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保存了你输入的名字. 现在你来想一想, 是不是你告诉构建函数一个参数, 然后生成了一个对象, 并且它的成员变量就是你输入的参数? 也就是说生成了一个你自定义名字的角色?
理解了什么是类, 现在来看看对象, 在刚刚的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类的方法会报错.
所有的对象式编程, 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()+"在华山之巅打了起来"); }看到这篇文章的大部分人接触到的语言, 除了c语言是过程式编译, 其他的语言几乎都是对象式编译. 所以很好的理解类和对象式非常重要的, 理解了这个, 后面的很多知识才有学习的能力. 就好比吃饭一样, 理解类和对象就是学会用筷子. 可能有很多地方解释的并不是很具体和准确, 有问题大家可以留言互相讨论.