Java教程

类和对象

本文主要是介绍类和对象,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、面向对象概述

1.OPP:Procedure Oriented Programming   面向过程的编程

  OOP:Object Oriented Programming      面向对象的编程

  面向过程OPP

  自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。

  面向对象OOP

  去饭店,张开嘴:老板!来一份鱼香肉丝!

2.面向对象有什么优势

  你不需要知道鱼香肉丝是怎么做的,如果你突然不想吃鱼香肉丝了,想吃红烧肉对于opp来说,不太容易,要重新准备食材。对于oop来说特别容易就可以换菜,大喊:老板!那个鱼香             肉丝换成红烧肉吧降低了耦合性提高了可维护性

  面向过程是具体化的,流程化的: 解决一个问题,你需要一步一步的分析,一步一步的实现。

  面向对象是模型化的:  不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

 

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护。

二、面向对象编程的基本特征

面向对象语言都有这三大特征

封装 :将功能封装成一个个独立的单元,减小耦合,避免牵一发而动全身,方便对程序的修改。

继承:代码重用,减少编码量,间接减少维护成本。

多态:不同的场合做出不同相应。

三、类和对象的定义

类和对象的关系

类: 就是一个模板,是一类对象的模板,它描述一类对象的行为和状态,定义了这些对象应该有的属性及方法。

对象: 万物皆对象。具体某一辆车就一个对象,车有轮胎,颜色等属性,有开车的行为,对象是类的具体体现。对象实质是:属性(成员变量)+行为(方法或者函数)。

 

 

 

生活中描述事物无非就是描述事物的属性和行为。

如:车有轮胎,颜色等属性,有开车的行为。

Java中用类class来描述事物也是如此。

属性:对应类中的成员变量。

行为:对应类中的成员函数(方法)。

 

学生这个对象的属性和方法

 

四、Java类的基本结构

类的结构:属性、方法、构造方法、内部类、块

五、类的声明形式以及作用

(一)类的声明

 

(二)类的作用

类的作用:类就是一个模板,定义多个对象共同的属性和方法

示例:public class Student{ }

 

六、属性的声明形式以及作用

(一)属性的定义

   属性即对象应有的数据

     注:属性又称为成员变量,是声明在类中的变量,在方法体中声明的变量称为局部变量或临时变量

(二)属性的声明方式

【访问权限修饰符】【修饰符】数据类型 属性名【=初值】;

示例: private String name;

       private double salary;

       private static int count=0;

1、分析的汽车类编码

//汽车类

public class Car {

       String color;  //颜色属性

       int tire; //轮胎属性

       // 开车的方法

       void run() {

              System.out.println("滴滴滴......");

       }

}

 

2、分析的学生类编码

//学生类

public class Student {

       String name;// 姓名

       int age; // 年龄

       public Student() {// 创建一个对象时需要的方法

       }

       // 有参的构造方法

       public Student(String name, int age) {

              super();

              this.name = name;

              this.age = age;

       }

       // 吃的方法

       public void eat() {

              System.out.println("吃的真香!!!");

       }

       public void sleep() {

              System.out.println("睡的正香!!!");

       }

       {

              System.out.println("我是实例块");

       }

       static {

              System.out.println("我是静态块");

       }

       // 内部类

       class InnerClass {

       }

       public static void main(String[] args) {

              // 类名 对象名 = new 该类的构造方法();

              Student stu1 = new Student();

              Student stu2 = new Student("lily", 18);

              stu2.sleep();

              System.out.println("stu1的学生名字:" + stu1.name);

              System.out.println("stu2的学生名字:" + stu2.name);

 

              stu2.name = "lucy"; // 给属性赋值

              System.out.println(stu2.name); // 获取属性值

              stu2.eat(); // 调用类的方法,该方法中的操作将被执行

       }

}

 

七、成员变量和临时变量

成员变量: 

   堆内存,声明在类体内方法外;

   可以在声明时赋值或者构造方法赋值,若不赋值,会有默认的初始值;

    作用域:整个类都可以使用。

临时变量:

   栈内存, 方法内,包括方法的参数;

   声明和赋值之后才能使用,否则编译就会报错;

   作用域:找括号(变量声明在哪对{}里,那么它就在哪对{}内生效),出了括号就不认识了。

成员变量和临时变量如果变量名相同,那么采用就近原则,以局部变量为准。

 

局部变量与成员变量的区别

//局部变量与成员变量的区别

public class VariableTest {

   int i ; //成员变量

   public void test() {

          i++;

          if(i>0) {

                 i=i+3;

          }

          System.out.println(i);

 

          int j =1;

          System.out.println(j);

   }

   public void test01() {

         int j = 2;  //局部变量 在方法内生效

         if(j>0) {

                int z =j;  //z局部变量  在if内生效

                System.out.println(z);

         }

         //System.out.println(z);  //此条语句报编译错误  因为z变量声明在if内,出了if就不能识别了

        

         int i = 20;

         System.out.println(i);  //20  就近原则 

   }

   public static void main(String[] args) {

       VariableTest v = new VariableTest();

       v.test();

       v.test01();

}

}

 

八、创建对象

如何创建对象?使用new调用构造方法创建类的一个对象:

调用无参数的构造方法

 

调用有参数的构造方法

 

创建对象的作用:要想访问一个类中的非私有成员,必须要先创建该类对象,通过对象名来访问。

 

九、访问对象的成员属性和方法

如何使用对象?使用“.”进行以下操作

访问类的属性:对象名.属性

调用类的方法:对象名.方法名(实参列表)

stu. name= “lucy";  //给属性赋值

System.out.println(stu. name); //获取属性值

student.eat();                //调用类的方法,该方法中的操作将被执行

 

十、方法的定义及声明形式

(一)方法的作用

Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。对于一些复杂的代码逻辑

,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号“{}”当中,

并且起一个名字。使用代码的时候,直接找到名字调用即可。

(二)定义

成员方法是类中进行数据处理(对象的行为),实现相关功能的函数。

方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。

(三)声明形式

【访问权限修饰符】【修饰符】返回值数据类型  方法名 ( 形式参数列表 )

    {

            执行语句;

            return  返回值;

   }

 

(四)方法的各部分解析

①方法的命名:方法名的第一个单词应以小写字母作为开头,后面的单词则使用驼峰命名法。eg: sendMessge

②访问权限修饰符及修饰符:都在后续学习中详细学习

③返回值类型 :即方法运行后的返回结果的数据类型。返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void。

     有返回值的情况:返回值类型和return后的返回值的数据类型必须一致.
     无返回值的情况:返回值类型用void,此时return可以省略不写或者return;

④形式参数列表:就是变量列表,用于存储调用方法时传递给方法的实际参数。

     语法:方法名(数据类型1 参数名1,数据类型2 参数名2,数据类型3 参数名3....)

     注意:参数的个数可以是0个、1个或者多个

⑤return:用于结束方法以及返回方法指定类型的值。

⑥返回值:该方法执行后的结果,该结果会返回给调用者。

⑦方法体:方法体里面不能写方法,可以写局部变量、运算符、流程控制、数组等一切符合java规范的代码。

(五)如何写一个方法

思考以下三个方面:

     ①明确方法是否有返回的结果,如果有,返回什么类型的结果?

     ②明确方法是否需要参数,如果需要,需要几个什么类型的参数?

     ③方法如何才能正确得到想要的结果? 

 按照格式和两个明确来完成如下功能

     ①定义一个方法,求三个整数的和,并获取和。

     ②定义一个方法,求三个数的平均数,并获取平均数。

import java.util.Scanner;

public class MethodTest {

       /*

        * 三个整数之和

        * (1)是否有返回值? 有 什么类型?int

        *  (2)是否需要参数? 需要参数? 几个什么类型? 三个int类型的参数

        *  (3) 相加

        */

       public int addInt(int a, int b, int c) {

              int sum = a + b + c; // 求和

              return sum;

       }

       // 定义一个方法,求三个数的平均数,并获取平均数。

       public int avgInt(int a, int b, int c) {

              int avg = (a + b + c) / 3; // 求和

              return avg;

       }

       /*

        * 键盘录入两个数,返回两个数中的较大值

        *

        * (1)方法是否有返回值,有 int

        * (2)方法是否需要参数,需要,需要几个什么类型的参数--两个 int

        * (3)方法如何才能正确得到想要的结果。if(a>b){ a }

        *

        */

       public int max(int a, int b) {

              int num;

              // 比较两个数返回最大的

              if (a > b) {

                     num = a;

              } else {

                     num = b;

              }

              return num;

       }

       /*

        * 键盘录入两个数,比较两个数是否相等

        *

        * (1)方法是否有返回值,有 boolean

        * (2)方法是否需要参数,需要,需要几个什么类型的参数? 两个int

        * (3)方法如何才能正确得到想要的结果。if(a==b){ true }{false}

        *

        */

 

       public boolean compare(int a, int b) {

              boolean result;

              // 比较两个数是否相等 相等--true 不相等--false

              if (a == b) {

                     result = true;

              } else {

                     result = false;

              }

              return result;

       }

 

       /*

        * 没有返回值 没有参数的 键盘录入行数和列数,输出对应的星号 2 3 ***

        * (1)方法是否有返回值,没有 void

        * (2)方法是否需要参数,需要,需要几个什么类型的参数? 两个int 也可以不需要

        * (3)方法如何才能正确得到想要的结果。先循环行数 再循环列数

        */

       public void printStart() {

              Scanner sc = new Scanner(System.in);

              System.out.println("请输入行数:");

              int rows = sc.nextInt();

              System.out.println("请输入列数:");

              int cols = sc.nextInt();

              // 先循环行数 再循环列数

              for (int i = 1; i <= rows; i++) {

                     // 再循环列数

                     for (int j = 1; j <= cols; j++) {

                            System.out.print("*");

                     }

                     System.out.println();

              }

       }

 

       public static void main(String[] args) {

              MethodTest m1 = new MethodTest(); // 创建当前类的对象

             

 

              // 接收控制台输入的a b两个数

               Scanner sc = new Scanner(System.in);

               System.out.println("请输入第一个数:");

               int a = sc.nextInt();

               System.out.println("请输入第二个数:");

               int b= sc.nextInt();

               System.out.println("请输入第三个数:");

               int c= sc.nextInt();

               

              // 调用三个数相加的方法

            int sum = m1.addInt(a,b,c); //通过对象名来调用方法,得到方法的返回值

            System.out.println("三个整数之和:"+sum);

               

            //调用求三个数的平均数,并获取平均数。

            int avg = m1.avgInt(a, b, c);

            System.out.println("三个平均值:"+avg);

               

            // 调用比较两个数是否相等

               boolean result = m1.compare(a, b);

               System.out.println("是否相等:"+result);

 

               // 调用返回较大数的方法

               int num = m1.max(a, b);

               System.out.println("两个数中较大的值是:"+num);

               

               

               //调用键盘录入行数和列数,输出对应的星形

               m1.printStart();

        

       }

      

 

}

 

 

(六)有明确返回值的方法调用

单独调用,没有意义

输出调用,有意义,但是不够好,因为我不一定非要把结果输出

赋值调用,推荐方式

练习1:键盘录入两个数据,返回两个数中的较大值

练习2:键盘录入两个数据,比较两个数是否相等

(七) 没有明确返回值的方法调用

其实就是void类型方法的调用

只能单独调用

练习:键盘录入行数和列数,输出对应的星形

 

(八)方法的特点

定义方法可以将功能代码进行封装。

方法只有被调用才会执行。

方法的出现提高代码的复用性。

方法若没有返回值,则用关键字void表示,那么该方法中的return语句如果在最后一行可以省略不写。

方法中可以调用方法,不可以在方法内部定义方法。

定义方法时,方法的结果应返回给调用者,交由调用者来处理

(九)代码改错

 

public class Student{

       public void showInfo(){

              return "我是一名学生";

          }

}

 

public class Student{

       public double getInfo(){

              double weight = 95.5;

              double height = 1.69;

             return weight, height;

          }

}

 

public class Student{

       public String showInfo(){

              return "我是一名学生";

              public double getInfo(){

                      double weight = 95.5;

                      double height = 1.69;

                  return weight;

            }}}

 

1、方法的返回类型为void,方法中不能有return返回值!

2、方法不能返回多个值

3、多个方法不能相互嵌套定义!

 

(十)案例

需求说明:

从键盘接收三门课分数,计算三门课的平均分和总成绩,编写成绩计算类实现功能

实现思路:

1、创建类 ScoreCalc

2、编写方法实现各功能

3、编写测试类

//计算成绩

public class ScoreCalc {

   //计算总成绩的方法    返回值 有 double   参数 有 3个double   做什么 ?加运算

       public double culTotalScore(double javaScore,double cScore,double dbScore) {

              double totalScore = javaScore+cScore+dbScore;

              return totalScore;

       }

   //计算平均分的方法  返回值 double   参数 1 double    做什么/3

       public double culAvg(double totalScore) {

              double avg = totalScore/3;

              return avg;

       }

      

}

 

 

import java.util.Scanner;

 

//计算成绩的测试类

public class ScoreCalcTest {

      

  public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);

       System.out.println("请输入java成绩:");

       double javaScore = sc.nextDouble();

       System.out.println("请输入c成绩:");

       double cScore = sc.nextDouble();

       System.out.println("请输入DB成绩:");

       double dbScore = sc.nextDouble();

      

       //必须创建对象 ,

       ScoreCalc c1 = new ScoreCalc();

       //通过对象调用方法

       double totalScore =  c1.culTotalScore(javaScore, cScore, dbScore);

       //调用计算平均分的方法

       double avg = c1.culAvg(totalScore);

       System.out.println("总成绩:"+totalScore+"\t平均分:"+avg);

}

}

 

 

 

十一、方法调用以及参数传递

(一)方法创建后如何调用?

语法:对象名.方法名(实际参数列表)

注意:1.实际参数就是传递实际的值。

  1. 实际参数可以是0个、1个或者多个,多个实际参数使用逗号分隔。

(二)调用无返回值的方法

 

(三)调用用返回值的方法

 

 

这篇关于类和对象的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!