Java面向对象
一、面向对象
- 定义【面试必备】:面向对象是一种编程思想,对象是指现实生活中的具体存在事物,是类的具体描述。【例如:一辆超跑跟超跑设计图纸==》图纸即为类,造出来的超跑就是对象】。
- 类是指一组具有相同或者相似的属性、行为的统称,是对象的抽象。
- 类的创建:
/** * 创建Dog类 * 抽取狗子的特征,定义为属性 * 抽取狗子的行为,定义为方法 * @author Dushine2008 * */ public class Dog { // 属性--品种-哈士奇、年龄-3、名字-道哥、颜色-黑白 String breed; int age; String name; String color; // 方法 public void eat(String food) { System.out.println("狗子喜欢吃:" + food); } public void sleep(int hour) { System.out.println("我们家的狗子每天睡觉时长是" + hour); } }
- 对象的创建:【类是对象的模板,可以使用类创建出无数个具体的对象】
- 语法格式:类名 对象名 = new 类名(参数列表);
-
public class DogTest { public static void main(String[] args) { Dog dog = new Dog(); // 调用方法 dog.eat("骨头"); dog.sleep(8); // 调用属性,属性如果没有提前赋值,得到的是默认值 int age = dog.age; System.out.println(age); // 给dog的属性赋值 dog.breed = "哈士奇"; dog.name = "二哈"; dog.age = 3; dog.color = "黑白"; // 调用dog的属性 System.out.println("狗子的品种是:" + dog.breed); System.out.println("狗子的名字是:" + dog.name); System.out.println("狗子的年龄是:" + dog.age); System.out.println("狗子的颜色是:" + dog.color); } }
- 图解【创建单个对象】:
-
图解【创建多个对象】:
-
二、局部变量和实例变量
类型 | 局部变量 | 实例变量(成员变量) |
定义位置 | 方法内部 | 类中方法外 |
存储位置 | 栈内存 | 堆内存 |
默认值 | 无,必须赋值在使用 | 有默认值,和数据类型有关 |
作用范围 | 整个方法 | 整个类 |
生命周期 | 创建方法到方法的结束 | 随着对象的创建而创建,对象的消失而消失 |
命名冲突 | 方法中不能存在重名的变量 | 可以和局部变量重名,局部变量优先级高 |
三、实例方法
- 定义:创建方法后可以使用对象调用的方法,每个方法都是独立存在的,不能写在其他方法中,不能使用static修饰,使用static修饰就变成类方法。
- 案例:
public class Student { // 属性 String name; /** * 见面打招呼的方法【实例方法】 * @param word 打招呼的内容 */ public void sayHi(String name) { System.out.println(name+"是一个好学生); } //调用实例方法 public static void main(String[] args) { // 创建学生对象stu01 Student stu01 = new Student(); stu01.name = "张飞"; //调用实例方法 stu01.sayHi("我乃燕人张翼德"); } }
四、方法重载
- 重载(Overload):一个类中定义多个相同名称的方法
- 要求:方法名相同;参数列表不同(类型、个数、顺序);与访问修饰符、返回值类型无关
- 注意:调用带有重载方法时,需要根据传入的实参去找到与之匹配的方法。
- 好处:灵活、方便、屏蔽使用差异。
五、构造方法
- 定义:构造方法是一种特殊的方法,创建对象时候调用,方法名必须和类名一致,没有返回值类型,无法在外部手动调用
- 语法格式:public 类名(参数列表){ 构造方法体 }
- 案例:
public class Demo01 { public static void main(String[] args) { //调用无参构造方法 Stu stu01 = new Stu(); System.out.println("=============="); //调用有参构造方法 Stu stu01 = new Stu(“张三”,25); } } class Stu{ //无参构造方法 public Stu() { System.out.println("我是Stu空参的构造方法"); } // 属性name和age String name; int age; //有参构造方法 public Stu(String name,int age) { System.out.println("我是Stu空参的构造方法"); } }
- 默认构造方法:在我们创建类的时候,如果没有写任何的构造方法,jvm会赠送一个空参的构造方法,若自己定义了则不赠送
六、this
- 定义:This是类中的默认引用,代表当前实例
- 当类服务于某个对象时,this则指向当前对象
- this的用法
- 第一种用法【调用实例属性、实例方法】
- 如:this.name、this.sayHi()
- 案例:
- 第二种用法【调用本类的其他构造方法】
- 如this()、this(实参)
- 案例:
- 第一种用法【调用实例属性、实例方法】
七、ATM小案例:
import java.util.Scanner; public class Demo07 { public static void main(String[] args) { /** * 银行ATM 模拟银行账户业务,实现存款、取款和余额查询。运行效果如下所示: 1.存款 2.取款 3.查询 0.退出 请选择你要办理的业务:1 请输入存款金额:1000 --------- 存款成功! 1.存款 2.取款 3.查询 0.退出 请选择你要办理的业务:2 请输入取款金额:100 --------- 取款成功! 1.存款 2.取款 3.查询 0.退出 请选择你要办理的业务:3 ---您当前账户余额:900元--- 1.存款 2.取款 3.查询 0.退出 请选择你要办理的业务:0 O(∩_∩)O谢谢您的使用,欢迎下次光临! */ Scanner in = new Scanner(System.in); // 创建银行卡 ATM atm = new ATM(1000); // 开启死循环,不断提示用书输入数据 outer:while (true) { System.out.println("1.存款 2.取款 3.查询 0.退出\r\n请选择你要办理的业务:"); int select = in.nextInt(); switch (select) { case 0: System.out.println("O(∩_∩)O谢谢您的使用,欢迎下次光临!"); break outer; // 存款的操作 case 1: System.out.println("请输入存款金额:"); int m1 = in.nextInt(); atm.saveMoney(m1); System.out.println("成功存入金额:" + m1 + ",余额:" + atm.getBalance()); break; // 取款的操作 case 2: System.out.println("请输入取款金额:"); int m2 = in.nextInt(); double ret = atm.takeMoney(m2); // 判断ret是否大于0 if (ret == m2) { System.out.println("成功取出:" + m2 + ",余额:" + atm.getBalance()); }else { System.out.println("余额不足"); } break; // 查询余额 case 3: System.out.println("当前账户余额:" + atm.getBalance()); default: System.out.println("输入有误,请再次输入..."); break; } } } } /** * 自助柜员机 * 定义了余额 * 定义存、取、查询的方法 * @author Dushine2008 * */ class ATM{ // 属性:余额 double balance; // 构造方法 public ATM() {} public ATM(double balance) { this.balance = balance; } // 存钱 public void saveMoney(int money) { this.balance += money; } // 取钱 public double takeMoney(int money){ // 判断余额是不是充足 if (money <= balance) { this.balance -= money; return money; } return 0; } // 查询 public double getBalance() { return this.balance; } }