学习Java不单单要学习基础语法,也要学习编程的思想, 其中要搞明白啥是 “类” ?啥是 “对象”?还有最重要的Java的核心思想, 面向对象(oop)!
这种思想 可以把生活中的复杂的事情,变得简单化,同样也用于程序开发中,从原来的 执行者变成指挥者!
面向对象 是基于 面向过程 而言的,且二者都是编程思想!
面向过程 强调的是过程,是指的 动作
面向对象 强调的是结果,是 操作 对象”完成某事。
上述案例的,外卖平台, 和具备洗衣服的女朋友都是指挥者操作 “对象” ! 也是java重要的思想之一!
现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体。
人类解决问题的方式通常都是把复杂的事物简单化,于是会思考这些对象是由什么组成的? 通常人们会将对象分为两个部分: 静态部分,和 动态部分。
什么是静态部分?什么是动态部分?
重点:总结理解: 每个都具有3个特点: 对象的属性, 对象的行为(方法), 对象的标识(内存地址值)。
分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地进行分类,将相近的事物归为一类,
类就是同一类事物的总称。如果将现实世界中的具体一个事物抽象成对象,类就是这类对象事物的统称,如: 人类,鸟类,家禽类。
举例子说明:看着教室的物品,说出该对象的属性和方法,并抽象出该类。
总结理解: 类,是 封装 对象的属性和行为的载体,或者说, 具有相同属性和行为的一类实体称之为类。
注意: 类中只能定义, 方法和属性初始化,
创建 管理员类
/**如图:
* 属性:姓名 , 年龄,
* 行为:介绍自己信息
*/
public class Administrator{ // 1,定义类名,类的首字母一定要大写!
// 2,编写属性
String name; //姓名
int age; // 年龄
// 3,定义方法
//介绍自己
public void info(){ //无返回值,无参数一个方法
System.out.println("我的名字是"+name+",年龄 "+age);
}
}
创建管理员类的实例化,即对象。
public class TestAdmin{
// 主程序的入口 main
public static void main(String[] args) {
// 1.创建对象 , new关键字 实例对象 admin返回的变量引用
Administrator admin = new Administrator();
//2. 周杰伦
admin.age=34;
admin.name="jaychou";
//3.方法调用 引用变量.方法名称();
admin.info();
}
}
Administrator admin = new Administrator();
这代码在内存中干了啥 ? 包含了两个部分:
类的无参方法分两种:有返回值类型 无参方法、 无返回值类型 无参数方法。
// 有返回值,有参数。
权限修饰符 返回值类型 方法名( ){
执行方法体;
return 返回值类型; // 关键字 return
}
// 无返回值,无参数
权限修饰符 无返回值类型 方法名( ){// 无返回值类型 关键字 void
执行方法体;
}
注意关键字:
return
返回值类型,void
表示无返回值类型。void
。
public class Car {
//属性
String color;//颜色
String name; //名称
//无参数无返回值
public void run(){
System.out.println("跑起来了");
}
public void call(){
//调用属性
System.out.println(color+ "的车,我的名字叫 "+name);
}
}
public class Car_Test {
public static void main(String[] args) {
//1.实例化对象
Car car = new Car();
//2. 给属性赋值
car.color="红色";
car.name="法拉利";
//3.调用方法
car.run();
car.call();
}
}
无参数有返回值方法。关键字return
。
public class Person {
//属性
String name; //姓名
int age;//年龄
//无参数有返回值
public String talk(){
//需要返回String数据类型的返回值
String s ="我的名字叫"+name+" 今年 "+age+" 岁了";
return s;
// System.out.println("");//return 后面不允许有其他语句相当于结束。
}
}
测试类
public class Person_Test {
public static void main(String[] args) {
Person p = new Person();
p.name="王一博";
//假设我age没有赋值,默认初始化 0;
String talk = p.talk();//会有返回类型
System.out.println(talk);//我的名字叫王一博 今年 0 岁了
}
}
// 要求: 使用无返回值无参方法 和 有返回值无参方法。
//有返回值类型 有参数
权限修饰符 返回值类型 方法名(参数1,参数2,参数3... ){
执行方法体;
return 返回值类型;
}
//无返回值类型 有参数
权限修饰符 无返回值类型 方法名(参数1,参数2,参数3... ){
执行方法体;
}
有参数有返回值,和 有参数无返回值。
public class Administrator {
String system_User=="admin"; //用户名,直接初始化
int sys_password==1234; // 数字4位数
Boolean flag;//登录信息 成功返回 true,失败返回false;
//登录系统信息 ,有参数无返回值
public void login(boolean flag){
if (flag==true){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}
//验证登录信息 有返回值有参数
public Boolean check(String user,int password){
//校验登录信息
if (user.equals(system_User)&&password==sys_password){
return true; //登录成功
}else {
return false; //登录失败
}
}
}
测试类Admin_Test.class
public class Admin_Test {
public static void main(String[] args) {
//1. 控制台输入用户名和密码,进行系统校验
System.out.println("请输入用户名: ");
String user = new Scanner(System.in).next();
System.out.println("请输入密码: ");
int password = new Scanner(System.in).nextInt();
//2.创建类的实例化对象
Administrator admin = new Administrator();
//3.调用方法
Boolean check = admin.check(user, password);//调用验证方法,注意传递参数顺序和个数
admin.login(check);//得到结果调用提示信息方法
}
}
// 要求: 使用无返回值有参方法 和 有返回值有参方法。
对象名 . 方法名();
Person p = new Person();
//方法调用
p.talk();
public class Persop {
public void like1(){
System.out.println("喜欢男生");
}
public void like2(){
System.out.println("喜欢女生");
}
// 3.方法里面也可以调用方法。
public void like3(){
Persop persop = new Persop(); //通过类的实例化对象。
persop.like();
persop.like2();
}
}
public class ResultDemo {
// 程序入口 main
public static void main(String[] args) {
//创建对象
Result r = new Result();
// 调用对象中的方法 r·方法
Scanner input = new Scanner(System.in);
System.out.println("请输入英语成绩:");
r.english = input.nextDouble();
System.out.println("请输入数学成绩:");
r.maths = input.nextDouble();
System.out.println("请输入语文成绩");
r.chinese = input.nextDouble();
//调用平均成绩方法
double avg = r.avg();
System.out.println("您的平均成绩为:"+avg);
//调用求和成绩方法
double sum = r.sum();
System.out.println("您的总成绩为: "+sum);
}
}
/**
* 创建一个结果类
*/
class Result{
double english; // 英语成绩
double chinese; //语文成绩
double maths; // 数学成绩
/*求平均值, 有返回值类型,无参数*/
public double avg(){
double sum = english+chinese+maths;
return sum/3;
}
/*求和, 有返回值类型,无参数*/
public double sum(){
double sum = english+chinese+maths;
return sum;
}
}
输出结果:
请输入英语成绩:
80
请输入数学成绩:
20
请输入语文成绩
100
您的平均成绩为:66.66666666666667
您的总成绩为: 200.0
定义用户类,要求使用 数组存储用户名称。
public class User {
//1.定义存储用户信息数组
String[] user_Name = new String[10];
//1.1 初始化信息
{
user_Name[2]="隔壁老吴";//提前存储信息
}
//2.定义方法
//2.1 添加用户方法
public void addName(String name){
for (int i = 0; i <user_Name.length ; i++) {
//2.2 添加信息时不能覆盖原来的信息
//TODO 怎么不能覆盖原来信息
if (user_Name[i]==null){ //不覆盖原来信息
user_Name[i]=name;
// 注意程序控制。为什么要加break ?
break;//一定要跳出。否则 填满将为null元素填满。
}
}
}
//2.2 显示方法
public void show_UserName(){
//遍历数组信息
for (int i = 0; i <user_Name.length ; i++) {
//TODO 没有存储的数据就不要显示
if (user_Name[i]!=null){
System.out.println(user_Name[i]);
}
}
}
public static void main(String[] args) {
User u = new User();
//调用添加方法
u.addName("张三");
u.addName("李四");
u.addName("王五"); //会覆盖隔壁老吴么?为什么?
u.addName("赵六");
//显示数组数据
u.show_UserName();
}
}
输出结果:
张三
李四
隔壁老吴
王五
赵六
public class User {
//1.定义存储用户信息数组
String[] user_Name = new String[10];
//1.1 初始化信息
{
user_Name[2]="隔壁老吴";//提前存储信息
}
//2.定义方法
//2.1 添加用户方法
public void addName(String name){
for (int i = 0; i <user_Name.length ; i++) {
//2.2 添加信息时不能覆盖原来的信息
//TODO 怎么不能覆盖原来信息
if (user_Name[i]==null){ //不覆盖原来信息
user_Name[i]=name;
break;//一定要跳出,否则全是第一个信息。
}
}
}
//2.2 显示方法
public void show_UserName(){
//遍历数组信息
for (int i = 0; i <user_Name.length ; i++) {
//TODO 没有存储的数据就不要显示
if (user_Name[i]!=null){
System.out.println(user_Name[i]);
}
}
}
/**
* 增加显示方法,
* @param begin 开始索引
* @param end 结束索引
* @param name 查询名称
* @return boolen
*/
public boolean seachName(int begin,int end,String name){
//返回标识
for (int i = begin; i <end ; i++) { //开始为0,结束为end为100可以么?
if (i<10&&name.equals(user_Name[i])){ //i的值不能超过数组元数个数
System.out.println("查询索引为"+i); //显示查询索引
return true; //返回即程序结束。
}
}
return false;
}
public static void main(String[] args) {
User u = new User();
//调用添加方法
u.addName("张三");
u.addName("李四");
u.addName("王五"); //会覆盖隔壁老吴么?为什么?
u.addName("赵六");
//显示数组数据
u.show_UserName();
boolean flag = u.seachName(80, 100, "隔壁老吴");//这样可以么
System.out.println(flag);
}
}
还记得什么是变量吧?怎么声明一个变量?
Java中声明变量的位置不同,在访问的时候也是有差别的,这个叫做 变量的作用域。
变量声明的位置,可以决定 变量的作用域,即生效范围, 怎么理解这句话呢?
我们可以先通过生活中的例子来理解这句话。
public class VarDemo {
/*定义在类里,方法外的成员变量*/
String name; // 姓名
int age; //年龄
double price; //价格
String adress; // 地址
/*程序入口 main方法, 也是方法*/
public static void main(String[] args) {
}
}
定义在方法里,那么这个变量称为局部变量。
代码中的位置:
public static void main(String[] args) {
String s = "我是定义在方法里面的局部变量";
System.out.println(s); // 局部变量使用时必须赋值;
}
看看二者的作用范围 。
public class Var {
//1.定义成员变量,
//?这些变量谁能使用?
String name;
int age;
//2.定义方法
public void say(){
String chinese ="中国话才是最吊的";
int age=18;
System.out.println(chinese+"我的年龄是 "+age);
}
//3.类中只能定义成员变量和方法,语句不能在类中定义只能在方法中
public static void main(String[] args) {
for (int i = 0; i <10 ; i++) {
System.out.println(i);
}
//这个位置能使用i的值么?
System.out.println(i);
Var var = new Var();
var.age=88;//给年龄赋值
var.say();// 输出的年龄是18还是88;
}
}
public class Bank {
//1. 属性账户 权限问题
private double money;
//1.1 如果权限私有的话,对外就需要提供访问的方法;get 和 set方法(省略)。
public double getMoney() {
return money;
}
/**
* 2. 第一个业务方法 存款=存钱+账户余额
*
* @param cash 存款
*/
public void saveMoney(double cash) {
//2.1 存款
money = money + cash;
System.out.println("存款金额: "+cash);
}
/**
* 3.取钱方法
* @param cash 取现金
*/
public void quMoney(double cash) {
//1.判断账户余额是否购取款金额
if (money >= cash) {
money = money - cash;//取款
System.out.println("取款金额是" + cash);
} else {
System.out.println("账户余额不足");
}
}
}
public class BankTest {
public static void main(String[] args) {
Bank bank = new Bank();
// bank.saveMoney(500);
// bank.quMoney(300);
// 也可以加一个 do{}while(flag); 正一个循环
System.out.println("请问您要办理的业务: 1 存款 2 取款 0退出");
//等值判断
int num = new Scanner(System.in).nextInt();
switch (num){
case 1:
//TODO
System.out.println("请输入您的存款金额:");
double m = new Scanner(System.in).nextDouble();
bank.saveMoney(m);//存款
//调用显示余额方法
double money = bank.getMoney();
System.out.println(money);
break;
case 2:
System.out.println("请您输入取款金额:");
double m2 = new Scanner(System.in).nextDouble();
bank.quMoney(m2);
//调用显示余额方法
double money = bank.getMoney();
System.out.println(money);
break;
case 0:
System.out.println("谢谢光临");
break;
default:
System.out.println("您选择的有误,请看提示");
break;
}
}
}
输出结果:
请问您要办理的业务: 1 存款 2 取款 0退出
1
请输入您的存款金额:
800
存款成功,您的余额为800.0