首页 > 代码库 > java面向对象编程(1)-类与对象

java面向对象编程(1)-类与对象

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;  //创建对象bb=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 类名{
      成员变量; 
     成员方法;}