Java基础02 面向对象

Posted DLNovice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础02 面向对象相关的知识,希望对你有一定的参考价值。

文章目录

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基础-面向对象部分

Android 高频面试之必考Java基础

(Java实习生)每日10道面试题打卡——Java基础知识篇

(Java实习生)每日10道面试题打卡——Java基础知识篇

每周 10 道 Java 面试题 : 面向对象, 类加载器, JDBC, Spring 基础概念

Java基础教程:面向对象编程