1.问题的提出
张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫。
//用前面学习过的知识写出代码如下:
public class Demo107{ public static void main(String []args){ int a=49;//输入的名字49,50 int cat1age=3; //第一只猫 String cat1name="小白"; String cat1color="白色"; int cat2age=100; //第二只猫 String cat2name="小花"; String cat2color="花色"; switch(a){ case '1': System.out.println(cat1age+cat1color); break; case '2': System.out.println(cat2age+cat2color); break; default: System.out.println("张老太没有这只猫!"); } } }
//用面向对象思想解决,代码如下:
//主函数 public class Demo105{ public static void main(String []args){ //创建一个猫对象 Cat cat1=new Cat();//Cat是定义的一个数据类型 //cat1=new Cat(); 等同于 Cat cat1=new Cat(); //访问属性的 对象名.属性名字 cat1.age=3; cat1.name="小白"; cat1.color="白色"; //创建第二只猫 Cat cat2=new Cat(); cat2.age=100; cat2.name="小花"; cat2.color="花色"; } } //java中[类名的首写字母大写]可根据程序的需要定义类 //定义猫类 class Cat{ //下面的就是类的成员变量/属性 int agr; String name; String color; Master myMaster; } //引用类型,比如建个主人类 class Master{ int age; String name; String address; }
说明:对比看来,传统方法显然很麻烦,需要定义很多变量,且变量之间没有内在的联系。因此,使用面向对象技术,把猫的特性提取出来-->猫类,然后再实例化对象。不同的猫拥有共同的属性,只是属性值不一样。如此编程,完全符合我们思维的一般逻辑,且代码简练易读。
2.类和对象的区别与联系
(1)、类是抽象的,概念的,代表一类事物,比如人类,猫类..
(2)、对象是具体的,实际的,代表一个具体事物
(3)、类对象的模板,对象是类的一个个体,实例
3.如何定义类
一个全面的类定义比较复杂,如:
package 包名; class 类名 extends 父类 implements 接口名{ 成员变量; 构造方法; 成员方法; }
要透彻的掌握类,必须要了解类的构成,下面由简单到复杂逐步完善类的定义:
class 类名{ // ----> 待定... 成员变量; }
类的成员变量是类的一个组成部分,一般是基本数据类型,也可是引用类型。比如我们前面定义猫类的int age 就是成员变量。
4.如何创建对象
创建一个对象有两种方法
1、先声明再创建
a.对象声明
类名 对象名;
b.对象创建
对象名 = new 类名();
2、一步到位法
类名 对象名=new 类名()
另外、对象访问(使用)对象的成员变量的格式一般是: 对象名.变量名; (注:加下控制符此表达就不准确了)对象总是存在内存中的!
例:定义一个人类(Person)(包括名字、年龄),用一步到位法去创建一个对象
//定义个人类 class Person{ int age; String name; }
使用个人类:
Person1 a=new Person1();//用一步到位法去创建一个对象 a.age=10; a.name="小明"; Person1 b; //创建对象b b=a; System.out.println(b.name);//输出“小明” b.age=200; System.out.println(a.age);//输出a.age为200
5.类--成员方法
在某些情况下,我们要需要定义成员方法。比如人类:除了有一些属性外(成员变量表示的年龄、姓名等),我们人类还有一些行为比如:可以说话、跑步..,通过学习,我们人类还可以做算术题。这时就要用成员方法才能完成。
现在要求对Person类完善:(1)添加speak成员方法,输入出:我是一个好人(2)添加jisuan成员方法,可以计算从1+..+1000的结果(3)修改jisuan成员方法,该方法可以接收一个数n,计算从1+..+n的结果(4)添加add成员方法,可以计算两个数的和。
类的成员方法(成员函数)定义:成员方法也叫成员函数,这里希望大家不要被两个名词搞晕了。
public 返回数据类型方法名(参数列表) { 语句;//方法(函数)主体 }
说明:
a.参数列表:表示成员函数输入
b.数据类型(返回类型):表示成员函数输出
c.函数主体:表示为了实现某一功能代码块
案例:类方法的调用[Demo108.java]
public class Demo108{ public static void main(String []args){ Person p1=new Person(); p1.speak();//调用speak方法 p1.jiSuan();//调用计算方法 p1.jiSuan(200);//调用可以传入参数的计算方法 p1.add(12,10);//调用两个数的和 int res=p1.add2(23,34);//调用两个数的和并返回值到res中 System.out.println("res返回值是:"+res); System.out.println("num1+num2+num3="+p1.add3(2,2.3f,4.5f));//返回类型一定要一致否则报错 } }
补充:定义名字的几个方法:
1、驼峰法 如myCry;2、下划线法my_cry
方法名在有不同参数的情况下可以使用同一个方法名,即有参数和没参数的方法可以同名。
下面定义Person类:
class Person{ //请注意类名首写字母应为大写如Person为类名 int age; String name; //1、可以输出我是好人方法 public void speak(){ //请注意方法名的首写字母应为小写如speak为方法名 System.out.println("我是一个好人"); } //2、可以计算1+..+1000的方法 public void jiSuan(){ int result=0; for(int i=1;i<=1000;i++){ result=result+i; } System.out.println("1+..+1000结果是"+result); } //3、带参数的成员方法,可以输入n值并计算1+..+n public void jiSuan(int n){ int result=0; for(int i=1;i<=n;i++){ result+=i; } System.out.println("1+..+n结果是"+result); } //4、计算两个数的和 public void add(int num1,int num2){ int result=0; //与下面一句等同于return num1+num2; result=num1+num2; System.out.println("num1+num2="+result); } //5、计算两个数的和,并将结果返回给主调(调用它的)函数 //注意:返回类型和返回结果的类型要一致 //注意:在调用某个成员方法的时候,给出的具体数值的个数 //和类型要相匹配。 public int add2(int num1,int num2){ return num1+num2; } //6、计算两个float数的和,并将结果返给主调函数 public float add3(int num1,float num2,float num3){ return num1+num2+num3; } }
类的成员方法声明,格式为:
访问修饰符 数据类型 函数名(参数列表);
例:
public int test(int a);/*方法声明*/
在给Person类添加add方法的例题中,我们看到的关键字return,它的功能是把表达式的值返回的值返回给主调函数的方法。
return 表达式;
类的成员方法(函数)--特别说明
1、方法的参数列表可以是多个,并且数据类型可以是任意的类型int float double char等。
访问修饰符 返回数据类型 函数名(参数列表){ 语句; //函数主体 }
2、方法的返回类型可以是任意的数据类型(int,float,double,char..)也可以没有返回值void表示没有返回值。
访问修饰符 返回数据类型 函数名(形参列表){ 语句; //函数主体 }
案例1:编写一个成员函数,从键盘输入一个整数(1-9),打印出对应的乘法表[Demo110.java]
//实例键盘输入打印乘法表[Demo110.java] import java.io.*; public class Demo110{ public static void main(String []args){ Cfb jiu=new Cfb(); jiu.cf(); } } class Cfb{ public void cf(){ try{ //输入流,从键盘接收数 InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); //给出提示 System.out.println("请输入1-9,按0退出:"); //从控制台读取一行数据 String a1=br.readLine(); //把String转为int int num1=Integer.decode(a1); for(int i=1;i<=num1;i++){ for(int j=1;j<=i;j++){ System.out.print(i+"×"+j+"="+(i*j)+"\t"); } System.out.println(); } }catch(Exception e){ e.printStackTrace(); } } }
案例2:设计计算机类,要求如下:[Demo109.java]
属性:品牌(Brand)、颜色(Color)、cpu型号(CPU)、内存容量(Memory)、硬盘大小(Harddisk)、价格(Price)、工作状态(Work)
方法:打开(Open)、关闭(Close)、休眠(Sleep)
创建一个计算机对象,调用打开,关闭方法。
//计算机类与对象的代码 import java.io.*;//加载IO流包 public class Demo109{ public static void main(String []args){ Computer Pc=new Computer(); Pc.Brand="品牌"; Pc.Color="颜色"; Pc.Cpu="Cpu型号"; Pc.Memory="内存容量"; Pc.Hd="硬盘容量"; Pc.Price="价格"; Pc.Work="工作状态"; try{ //输入流,从键盘接收数 InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); //给出提示 System.out.println("请输入0-9控制机器"); //从控制台读取一行数据 String a1=br.readLine(); //把String转为float float num1=Float.parseFloat(a1); if(num1==0){Pc.open();} else if(num1==1){Pc.close();} else if(num1==2){Pc.sleep();} else if(num1==3){System.out.println(Pc.Brand);} else if(num1==4){System.out.println(Pc.Color);} else if(num1==5){System.out.println(Pc.Cpu);} else if(num1==6){System.out.println(Pc.Memory);} else if(num1==7){System.out.println(Pc.Hd);} else if(num1==8){System.out.println(Pc.Price);} else if(num1==9){System.out.println(Pc.Work);} else {System.out.println("输入错误!");} }catch(Exception e){ e.printStackTrace(); } } } class Computer{ String Brand; String Color; String Cpu; String Memory; String Hd; String Price; String Work; public void open(){ System.out.println("开机"); } public void close(){ System.out.println("关机"); } public void sleep(){ System.out.println("休眠"); } }
至此,类的定义便可完善一步:
class 类名{
成员变量;
成员方法;
}