Java基础02 面向对象
Posted DLNovice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础02 面向对象相关的知识,希望对你有一定的参考价值。
文章目录
- 01 面向对象基础
- 02 面向对象进阶
- 03 常用API
01 面向对象基础
大纲:
- 设计对象并使用
- 封装
- this关键字
- 构造方法
- 标准JavaBean
- 对象内存图
- 补充知识:成员变量、局部变量的区别
1、设计对象并使用
1.1 类和对象
示例代码:
-
定义一个类:Phone
public class Phone String name; double price; public static void call() System.out.println("手机在打电话"); public static void playGame() System.out.println("手机在玩游戏");
-
创建对象
public class PhoneTest public static void main(String[] args) Phone p = new Phone(); // 给手机赋值 p.price = 1999.99; // 获取对象中的值 System.out.println(p.price); // 1999.99 // 调用手机中的方法 p.call(); // 手机在打电话 p.playGame(); // 手机在玩游戏
小结:
1.2 类的几个补充注意事项
定义类的补充注意事项:
小结:
2、封装
面向对象三大特征:封装、继承、多态
2.1 封装的概念
2.2 private关键字
private关键字:
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 被private修饰的成员只能再本类中才能访问
示例使用场景:加入我定义了一个女朋友类,我不希望女朋友的名字和年龄被错误的赋值,此时就可以基于private实现该功能,示例代码如下
public class GirlFriend
String gender;
private String name;
private int age;
此时访问name就会报错
GirlFriend g1 = new GirlFriend();
g1.name = "小红";
// java: name 在 ***.GirlFriend 中是 private 访问控制
如果想修改private修饰的成员:
- 基于方法:在GirlFriend中提供get()和set()方法,分别用于获取和赋值
示例代码:
public class GirlFriend
private int age;
public void setAge(int a)
if(a >= 18 && a <= 20)
age = a;
else
System.out.println("非法数据");
public int getAge()
return age;
public class GirlFriendTest
public static void main(String[] args)
GirlFriend g1 = new GirlFriend();
g1.setAge(18);
int age = g1.getAge();
System.out.println(age); // 18
g1.setAge(-18); // 非法数据
补充:关于static
- 用static 修饰的方法可以直接被调用, 不用static修饰的需要先实例化一个对象后才可以被调用
- 比如 person这个类里面有一个方法public static add()
- 那么可以直接用person类调用 person.add();
- 当然也可以用下面的方法先出一个对象在调用也是可以
- 如果这个方法前面没有static 比如 public add(),那么先要person p=new person(),然后用p.add(),类加载器在加载这个类的时候就已经实例化了这个类
- 注意,初始化加载,比较占内存
3、this关键字
3.1 就近原则
谁离的近先用谁
private int age; // 0
public void tempMethod()
int age = 80; // 局部变量
System.out.println(age);
GirlFriend g1 = new GirlFriend();
g1.tempMethod(); // 80
那么如果我想使tempMethod()
打印的结果为private int age;
中的age,怎么办呢?
使用this关键字。
3.2 this
作用:可以区别成员变量和局部变量
示例代码:
private int age; // 0
public void tempMethod()
int age = 80;
System.out.println(this.age);
GirlFriend g1 = new GirlFriend();
g1.tempMethod(); // 0
此时,我们就可以基于this关键字优化之前的代码:
public class GirlFriend
private int age; // 0
public void setAge(int age)
if(age >= 18 && age <= 20)
this.age = age;
else
System.out.println("非法数据");
public int getAge()
return this.age;
4、构造方法
4.1 构造方法的概述
根据使用场景,构造方法分为:
-
空参构造方法
-
有参构造方法
示例代码:
package day4.code;
public class Student
private String name;
private int age;
public Student()
System.out.println("无参构造函数");
public Student(String name, int age)
this.name = name;
this.age = age;
public void setName(String name)
this.name = name;
public String getName()
return this.name;
public void setAge(int age)
this.age = age;
public int getAge()
return this.age;
基于无参构造:
// 无参构造函数
Student stu = new Student(); // 无参构造函数
stu.setName("张三");
stu.setAge(18);
System.out.println(stu.getName() + stu.getAge()); // 张三18
基于有参构造:
Student stu = new Student("李四", 20);
System.out.println(stu.getName() + stu.getAge()); // 李四20
4.2 构造方法的注意事项
4.3 小结
5、标准JavaBean
JavaBean是一个遵循特定写法的Java类
假如我们要实现这样一个功能:
示例代码:
备注:
构造方法、get、set写起来太繁琐(使用IDEA时)?
- 快捷键Alt + Insert 或者 Alt + Fn + Insert
- 或者下载一个插件PGT
public class User
private String name;
private String password;
private String gender;
private String mail;
private int age;
public User(String name, String password, String gender, String mail, int age)
this.name = name;
this.password = password;
this.gender = gender;
this.mail = mail;
this.age = age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
public String getGender()
return gender;
public void setGender(String gender)
this.gender = gender;
public String getMail()
return mail;
public void setMail(String mail)
this.mail = mail;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
6、对象内存图
视频链接:面向对象-07-三种情况的对象内存图
大纲:
- 一个对象的内存图
- 多个对象的内存图
- 两个变量指向同一个对象内存图
- this的内存原理
- 基本数据类型和引用数据类型的区别
- 局部变量和成员变量的区别
先回顾一下JVM的内存分配:
6.1 一个对象的内存图
6.2 多个对象的内存图
6.3 两个变量指向同一个对象内存图
6.4 this的内存原理
this的作用:区分局部变量和成员变量。
那么是通过什么方式区分的呢?
this的本质:所在方法调用者的地址值
那么关于set、get方法的内存原理呢?
6.5 基本数据类型和引用数据类型的区别
首先区别基本数据类型与引用数据类型:
- 基本数据类型:整数类型、浮点数类型、布尔类型、字符类型
- 变量中存储真实的数据
- 引用数据类型:除了上述类型的其他所有类型
- 变量中存储的是地址值
- 引用:使用了其他空间中的数据
基本数据类型:
引用数据类型:
小结:
6.6局部变量和成员变量的区别
成员变量:类中方法外的变量。
局部变量:方法中的变量。
了解即可:
7、面向对象综合训练
- 文字版格斗游戏
- 对象数组练习
- 购物车
7.1 文字版格斗游戏
7.1.1 基础版
示例代码:
import java.util.Random;
public class Role
private String name;
private int blood;
public Role(String name, int blood)
this.name = name;
this.blood = blood;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getBlood()
return blood;
public void setBlood(int blood)
this.blood = blood;
public void attack(Role role)
Random r = new Random();
// 设每次攻击伤害在1~20之间
int hurt = r.nextInt(20) + 1;
// 计算剩余血量,若为负数,则变为0
int residualBlood = role.getBlood() - hurt;
residualBlood = residualBlood < 0 ? 0 : residualBlood;
role.setBlood(residualBlood);
System.out.println(this.getName() + "打了" + role.getName() + "一下,造成了" + hurt + "伤害,对方剩余"
+ residualBlood + "血量");
public class RoleTest
public static void main(String[] args)
Role r1 = new Role("奥特曼", 100);
Role r2 = new Role("小怪兽", 100);
while (true)
r1.attack(r2);
if(r2.getBlood() == 0)
System.out.println(r1.getName() + "击败了" + r2.getName());
break;
r2.attack(r1);
if(r1.getBlood() == 0)
System.out.println(r2.getName() + "击败了" + r1.getName());
break;
结果展示:
奥特曼打了小怪兽一下,造成了10伤害,对方剩余90血量
小怪兽打了奥特曼一下,造成了8伤害,对方剩余92血量
奥特曼打了小怪兽一下,造成了15伤害,对方剩余75血量
小怪兽打了奥特曼一下,造成了5伤害,对方剩余87血量
奥特曼打了小怪兽一下,造成了19伤害,对方剩余56血量
小怪兽打了奥特曼一下,造成了14伤害,对方剩余73血量
奥特曼打了小怪兽一下,造成了7伤害,对方剩余49血量
小怪兽打了奥特曼一下,造成了8伤害,对方剩余65血量
奥特曼打了小怪兽一下,造成了9伤害,对方剩余40血量
小怪兽打了奥特曼一下,造成了8伤害,对方剩余57血量
奥特曼打了小怪兽一下,造成了18伤害,对方剩余22血量
小怪兽打了奥特曼一下,造成了2伤害,对方剩余55血量
奥特曼打了小怪兽一下,造成了8伤害,对方剩余14血量
小怪兽打了奥特曼一下,造成了1伤害,对方剩余54血量
奥特曼打了小怪兽一下,造成了20伤害,对方剩余0血量
奥特曼击败了小怪兽
备注:你可能觉得最终结果为什么总是奥特曼赢,这结果不随机啊?因为奥特曼先出手的。
7.1.2 升级版
升级版代码量很多,但本质上就是把长相、打斗的攻击方式的各种修饰语句存入列表,然后打斗时基于Random随机抽取出来。
在上一个的基础上,我想看到人物的性别和长相,打斗的时候我想看到武功招式。
举例:
程序运行之后结果为:
姓名为:乔峰 血量为:100 性别为:男 长相为:气宇轩昂
姓名为:鸠摩智 血量为:100 性别为:男 长相为:气宇轩昂
乔峰使出了一招【背心钉】,转到对方的身后,一掌向鸠摩智背心的灵台穴拍去。给鸠摩智造成一处瘀伤。
鸠摩智使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向乔峰。结果乔峰退了半步,毫发无损。
。。。。
乔峰K.O.了鸠摩智
分析:
长相是提前定义好的,提前放在一个数组当中,程序运行之后,从数组中随机获取。
//男生长相数组
String[] boyfaces = "风流俊雅", "气宇轩昂", "相貌英俊", "五官端正", "相貌平平", "一塌糊涂", "面目狰狞";
//女生长相数组
以上是关于Java基础02 面向对象的主要内容,如果未能解决你的问题,请参考以下文章
(Java实习生)每日10道面试题打卡——Java基础知识篇
(Java实习生)每日10道面试题打卡——Java基础知识篇