java面向对象编程,一-类与对象

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 类名{
     成员变量; 
     成员方法;
}