例题:
我有两只狗子,一只叫小白,今年4岁,白色;另一只叫小黑,今年8岁,黑色。要求当我们输入狗子的名字时,就显示出它的所有信息,如果用户输入的名字错误,则显示未能找到。
1)利用单个的变量来进行解决
String dog1name="小白";
int dog1age=4;
String dog1color="白色";
String dog2name="小黑";
int dog2age=8;
String dog2color="黑色";
这样做表面看上去没有什么问题,确实可以做到,但是当我们每拥有一条狗子的时候我们都要去进行一次变量的定义,这显然很离谱,也不可能有这么多的资源来让你存储变量。
2)利用数组进行存储
String[]dog1= {"小白","4","白色"};
String[]dog2= {"小黑","8","黑色"};
这样也能进行解决,但是这样每个数据的类型就只能统一成一种才行,有许多的弊病;也只能通过数组的下标来进行数据的获取,会造成变量名字与内容的对应关系不对应;不能体现出它的行为特征
总而言之在之前的学习的内容,不能够很好的解决其对于数据的管理,并且效率很低;
这样就需要另外的一种技术:类与对象。
类就相当于是一个自定义的一个数据类型,它可以被定义的很复杂,里面可以有属性以及行为。
对象就是一个具体的实例。
使用面向对象的方式进行解决上述问题:
a:先定义一个Dog类
//class :类的关键词
class Dog{//该类所具有的属性
String name;//名字及其对应的数据类型
int age;
String clolor;
}
b: 实例化对象并对其进行赋值操作
Dog dog1=new Dog();//实例化出来一个实体dog1
dog1.name="小白";//对dog1的各个属性进行赋值
dog1.age=4;
dog1.clolor="白色";
//这里的运算符‘.’可以理解为“的”。
Dog dog2=new Dog();//实例化出来一个实体dog2
dog2.name="小黑";//对dog2的各个属性进行赋值
dog2.age=8;
dog2.clolor="黑色";
c:进行访问数据
System.out.println("狗子的信息:"+dog1.name+" "+dog1.age+" "+dog1.clolor);
System.out.println("狗子的信息:"+dog2.name+" "+dog2.age+" "+dog2.clolor);
输出为:
到此我们就可以完成这道例题的要求了:
Scanner myScanner=new Scanner(System.in);
System.out.print("请输入狗子的姓名:");
String dogname=myScanner.next();
if(dogname.equals(dog1.name)) {
System.out.println("狗子的名字:"+dog1.name+" "+"狗子的年龄"+dog1.age+" "+"狗子的颜色:"+dog1.clolor+" ");
}else {
System.out.println("没能找到狗子的相关信息");
}
if(dogname.equals(dog2.name)) {
System.out.println("狗子的名字:"+dog2.name+" "+"狗子的年龄"+dog2.age+" "+"狗子的颜色:"+dog2.clolor+" ");
}else {
System.out.println("没能找到狗子的相关信息");
}
结果:
到此,我们看出
1)类是抽象的,概念的,代表的一类事物,如人类,物种的种类等等
2)对象是具体的,实际的,代表的一个实例,如上述的dog1,dog2啥的
3)类是对象的模板,对象是类的一个个体,对应一个实例
PS:新建类类放在程序的最外面,即在公共类外,不然会报No enclosing instance of type Obj_01 is accessible. Must qualify the allocation with an enclosing instance of type Obj_01 (e.g. x.new A() where x is an instance of Obj_01).这类的错误。这个会成为公共类中的内部类,不能直接在main方法中实例化,main方法是static类。可以将内部类定义成static class ,或者当做普通的类来定义(拿到公共类外部定义)