1.OPP:Procedure Oriented Programming 面向过程的编程
OOP:Object Oriented Programming 面向对象的编程
面向过程OPP
自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。
面向对象OOP
去饭店,张开嘴:老板!来一份鱼香肉丝!
2.面向对象有什么优势
你不需要知道鱼香肉丝是怎么做的,如果你突然不想吃鱼香肉丝了,想吃红烧肉对于opp来说,不太容易,要重新准备食材。对于oop来说特别容易就可以换菜,大喊:老板!那个鱼香 肉丝换成红烧肉吧降低了耦合性提高了可维护性
面向过程是具体化的,流程化的: 解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的: 不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护。
面向对象语言都有这三大特征
封装 :将功能封装成一个个独立的单元,减小耦合,避免牵一发而动全身,方便对程序的修改。
继承:代码重用,减少编码量,间接减少维护成本。
多态:不同的场合做出不同相应。
类和对象的关系
类: 就是一个模板,是一类对象的模板,它描述一类对象的行为和状态,定义了这些对象应该有的属性及方法。
对象: 万物皆对象。具体某一辆车就一个对象,车有轮胎,颜色等属性,有开车的行为,对象是类的具体体现。对象实质是:属性(成员变量)+行为(方法或者函数)。
生活中描述事物无非就是描述事物的属性和行为。
如:车有轮胎,颜色等属性,有开车的行为。
Java中用类class来描述事物也是如此。
属性:对应类中的成员变量。
行为:对应类中的成员函数(方法)。
学生这个对象的属性和方法
类的结构:属性、方法、构造方法、内部类、块
类的作用:类就是一个模板,定义多个对象共同的属性和方法
示例: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.实际参数就是传递实际的值。