一.OOP:Object Oriented Programming
1.面向过程和面向对象
面向过程
面向对象
区别
事物比较简单,可以用线性的思维去解决
事物比较复杂,使用简单的线性思维无法解决
共同点
1.面向过程和面向对象都是解决实际问题的一种思维方式
2.二者相辅相成,并不是对立的。解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系、方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理
2.举例
如何吃午饭
面向过程
面向对象
买菜
洗菜
点火
......
吃饭
饭店
厨师
在饭店吃厨师做好的饭
二.对象和类
对象和类的概念
- 对象:是具体的事物
- 类:是对象的抽象
先有具体的对象,然后抽象各个对象之间象的部分,归纳出类通过类再认识其他对象。
三.对象的特征
1.属性
属性——对象具有的各种特征
每个对象的每个属性都拥有特定值
2.方法
方法——对象执行的操作
对象:用来描述客观事物的一个实体,由一组属性和方法构成
四.类的特征
1.属性
属性(field),或者叫成员变量
▪属性用于定义该类或该类对象包含的数据或者说静态属性。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。(数值:0,0.0 char:\u0000, boolean:false, 所有引用类型:null)
▪属性定义格式:
[修饰符] 属性类型 属性名 = [默认值]
2.方法
面向对象中,整个程序的基本单位是类,方法是从属于对象的
方法定义格式:
[修饰符] 方法返回值类型 方法名(形参列表 ) {// n条语句}
JAVA中方法参数传递是:值传递!
public class Student { //定义属性 int StuNumber; String name; int age = 20; //定义方法 void study() { System.out.println("学习不要谈恋爱"); } void play() { System.out.println("只学习不玩耍,聪明孩子也变傻"); } void eat(String food) { System.out.println("吃"+food); }}
但是大家要注意,不是每一个类都有方法和属性
五.创建和使用对象
既然已经创建了一个类,那就需要学习如何创建一个对象:
new关键字来创建一个对象:类名 对象名 = new 类名()
对象的使用:对象名称.属性对象名称.方法
public class Student{ //定义属性 int StuNumber; String name; int age; //定义方法 void study() { System.out.println("学习不要谈恋爱"); } void play() { System.out.println("只学习不玩耍,聪明孩子也变傻"); } void eat(String food) { System.out.println("吃"+food); } public static void main(String[] args) { Student stu1 = new Student(); System.out.println("默认值"); System.out.println(stu1.name); System.out.println(stu1.age); System.out.println(stu1.StuNumber); stu1.study(); stu1.eat("peach"); stu1.name = "Jack"; System.out.println("录入值"); //修改属性值 stu1.StuNumber = 2023119; stu1.age = 18; System.out.println(stu1.name); System.out.println(stu1.age); System.out.println(stu1.StuNumber); stu1.study(); stu1.eat("peach"); stu1.name = "Jack"; }}
可以类别之前学习的C语言结构体
六.案例
输入管理员名称和密码,正确才有权限更新,错误次数超过三次显示锁定。
import java.net.SocketTimeoutException;import java.util.Scanner;public class Administrator { String loginName = "ak27"; String password = "12345"; public void introduce(){ System.out.println(loginName); System.out.println((password)); } public static void main(String[] args) { Administrator admin = new Administrator(); int count = 0; for(count=0; ; count++) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String name = sc.nextLine(); System.out.println("请输入密码:"); String psd = sc.nextLine(); if (name.equals(admin.loginName) && psd.equals(admin.password)) { System.out.println("密码以及用户名正确"); System.out.println("请输入新的用户名"); admin.loginName=sc.nextLine(); System.out.println("请输入新的密码"); admin.password=sc.nextLine(); break; } else { int left = 2 - count; if (count == 2) { System.out.println("密码或用户名错误超过三次,系统锁定"); break; } System.out.println("密码或用户名错误,还有" + left + "次机会"); } } }}
案例中在进行字符串比较时,使用的是equals。
字符串在进行比较时,==比较的是地址,equals比较的是具体的值。
练习:尝试将下述代码设计的更加符合事实:例如设密码要重复输入两次
import java.net.SocketTimeoutException;import java.util.Scanner;public class Administrator { String loginName = "ak27"; String password = "12345"; public void introduce(){ System.out.println(loginName); System.out.println((password)); } public static void main(String[] args) { Administrator admin = new Administrator(); int count = 0; for(count=0; ; count++) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String name = sc.nextLine(); System.out.println("请输入密码:"); String psd = sc.nextLine(); if (name.equals(admin.loginName) && psd.equals(admin.password)) { System.out.println("密码以及用户名正确"); System.out.println("请输入新的用户名"); admin.loginName=sc.nextLine(); System.out.println("请输入新的密码"); admin.password=sc.nextLine(); break; } else { int left = 2 - count; if (count == 2) { System.out.println("密码或用户名错误超过三次,系统锁定"); break; } System.out.println("密码或用户名错误,还有" + left + "次机会"); } } }}