文章目录

  • 面对对象
    • 设计对象并使用
    • 封装
    • this关键字
    • 构造方法
    • 标准javabean
    • 对象内存图
      • 一个对象的内存图
      • 多个对象的内存图
      • 两个变量指向同一个对象内存图
      • this的内存原理
      • 基本数据类型和引用数据类型的区别
      • 局部变量和成员变量的区别
    • 面对对象综合训练
      • 文字格斗游戏
      • 对象数组练习

面对对象

设计对象并使用

类:共同特征的描述
对象:是真实存在的具体实例

类的定义:
public class 类名{
 1.成员变量
 2.成员方法
}
获取类:
类名 对象名 = new 类名();
使用类:
对象.成员方法(...)
对象.成员属性;

一个代码文件中可以有多个类,但是只有一个类可以用public修饰的,public修饰的类名必须是java代码的文件名称
成员变量的定义格式:
修饰符 数据类型 变量名称 = 初始化值;
一般无需指定初始化值,系统默认的初始化值和在定义变量时是一样的

注意:
静态方法:
静态方法需要加上关键字static 它属于类 所以可以在类中直接调用 在类外 通过 类名.方法名() 就能直接调用
实例方法:
实例方法不需要加static 在类中调用需要先创建实例对象然后再调用 在类外也是一样

封装

原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

1.private关键字是一个权限修饰符
2.可以修饰成员(成员变量和成员方法)
3.被private修饰的成员只能在本类中才能访问


public class GirlFriend {

    private int age;

    public void setAge(int a){
        if(a >= 18 && a <= 50){
            age = a;
        }else{
            System.out.println("非法数据");
        }
    }

    public int GetAge(){
        return age;
    }
}


public class GirlFriendTest {
    public static void main(String[] args){
        GirlFriend g = new GirlFriend();
        g.setAge(20);
        System.out.println(g.GetAge());
    }
}

this关键字

当参数名与类中的成员变量同名时,系统会实行就近原则,所以为了区分局部变量和全局变量 可以使用this关键字 this.成员变量

public class GirlFriend {

    private int age;

    public void setAge(int age) {
        if(age >= 18 && age <= 50){
            this.age = age;
        }else{
            System.out.println("非法数据");
        }
    }

    public int GetAge(){
        return age;
    }
}

构造方法

/*
* 构造方法的作用:由虚拟机自动调用,给类中的成员变量初始化
* 构造方法的两种方式:
* 1.无参构造:不需要传入参数,成员变量初始化为默认值
* 2.有参构造:传入对应参数,给成员变量赋值
* 构造方法的注意事项:
* 当没有写构造方法时,虚拟机会默认创建一个无参构造,并调用
* 当调用有参构造时 就不会调用无参构造了
* 建议在有无有参构造时 都把无参构造加上
* */

public class GirlFriend {

    private int age;
    private String name;

    public GirlFriend(){
        System.out.println("hello world");
    }

    public GirlFriend(String name){
        this.name = name;
    }

    public void setAge(int age) {
        if(age >= 18 && age <= 50){
            this.age = age;
        }else{
            System.out.println("非法数据");
        }
    }

    public int GetAge(){
        return age;
    }
    public String getName(){
        return name;
    }
}

标准javabean

在这里插入图片描述

public class user {

    private String name,E_mail,password,gender;
    private int age;

    public user() {
    }

    public user(String name, String e_mail, String password, String gender, int age) {
        this.name = name;
        E_mail = e_mail;
        this.password = password;
        this.gender = gender;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getE_mail() {
        return E_mail;
    }

    public void setE_mail(String e_mail) {
        E_mail = e_mail;
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}

对象内存图

一个对象的内存图

1.加载class文件
2.申请局部变量
3.在堆内存中开辟一个空间
4.默认初始化
5.显示初始化
6.构造方法初始化
7.将堆内存中的地址赋值给左边的局部变量
在这里插入图片描述

多个对象的内存图

两个变量指向同一个对象内存图

this的内存原理

this的本质:所在方法调用者的地址值

基本数据类型和引用数据类型的区别

局部变量和成员变量的区别

成员变量:类中方法外 会有默认值
局部变量:方法内,或者是方法的形参 没有默认值

面对对象综合训练

文字格斗游戏

这是格式化的输出方法
System.out.printf("%s",String);
键盘录入:
第一套体系:
nextInt(); 输入整数
nextDouble(); 输入浮点数
next(); 输入字符串
遇到空格 制表符 回车就停止接受数据

第二套体系
nextLine();
遇到回车才停止接收数据;

这两种体系不能混合使用 因为如果先用第一种体系
他最后留下来的回车会被第二套体系接收 导致第二套体系还没有收到他应该收到的数据就提前结束了 所以导致第二套体系收到的数据只是一个回车符




gameRole.java

import java.util.Random;


public class gameRole {
    private String name;
    private int blood;
    private char gender;
    private String face;
    String[] boyfaces= {"风流俊雅","气宇轩昂","相貌英俊","五官端正","相貌平平","一塌糊涂","面目狰狞"};
    String[] girlfaces ={"美奂绝伦","沉鱼落雁","婷婷玉立","身材娇好","相貌平平","相貌简陋","惨不忍睹"};

    // attack 攻击描述:
    String[] attacks_desc={
            "%s使出了一招【背心钉】,转到对方的身后,一掌向%s背心的灵台穴拍去。",
            "%s使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向%s。",
            "%s大喝一声,身形下伏,一招【劈雷坠地】,捶向%s双腿。",
            "%s运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向%s。",
            "%s阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向%s。",
            "%s上步抢身,招中套招,一招【劈挂连环】,连环攻向%s。"
    };

    // injured 受伤描述:
    String[] injureds_desc={
            "结果%s退了半步,毫发无损",
            "结果给%s造成一处瘀伤",
            "结果一击命中,%s痛得弯下腰",
            "结果%s痛苦地闷哼了一声,显然受了点内伤",
            "结果%s摇摇晃晃,一跤摔倒在地",
            "结果%s脸色一下变得惨白,连退了好几步",
            "结果『轰』的一声,%s口中鲜血狂喷而出",
            "结果%s一声惨叫,像滩软泥般塌了下去"
    };

    public gameRole(){

    }
    public gameRole(String name,int blood,char gender){
        this.name = name;
        this.blood  = blood;
        this.gender = gender;
        setFace(this.gender);
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getFace() {
        return face;
    }

    public void setFace(char gender) {
        Random r = new Random();
        if(gender == '男'){
            int index = r.nextInt(boyfaces.length);
            this.face = boyfaces[index];
        }else if(gender == '女'){
            int index = r.nextInt(girlfaces.length);
            this.face = girlfaces[index];
        }
    }

    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(gameRole r1){
        Random r = new Random();
        int index = r.nextInt(attacks_desc.length);
        System.out.printf(attacks_desc[index],this.name,r1.name);
        System.out.println();
        System.out.printf(injureds_desc[index],r1.getName());


        int hurt = r.nextInt(20)+1;
        r1.setBlood((r1.blood - hurt < 0 ? 0:r1.blood - hurt));

    }


}

gameRoleTest.java

public class gameRoleTest {
    public static void main(String[] args){
        gameRole r1 =new gameRole("小明",100,'男');
        gameRole r2 =new gameRole("小美",100,'女');
        while(true){
            r1.attack(r2);
            if(r2.getBlood() == 0){
               System.out.println(r1.getName() +"ko了"+r2.getName());
                break;
            }
            r2.attack(r1);
            if(r1.getBlood() == 0){
                System.out.println(r2.getName() +"ko了"+r1.getName());
                break;
            }
        }
    }
}

对象数组练习

在这里插入图片描述

类定义

public class Student {

    private String id;
    private String name;
    private int age;

    public Student() {
    }

    public Student(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

测试代码

import java.util.Scanner;

public class StudentTest {
    private static int now_cnt = 0;

    public static void main(String[] args){
         
        Student[] arr =new Student[3];

//        arr[now_cnt++] =new Student("heima002","小美",20);
//        add_student(arr);
//        print_Student(arr);
//        delete_Student(arr,"heima001");
//        print_Student(arr);
//        quary_Student(arr,"heima002");
//        print_Student(arr);

    }

    public static void add_student(Student[] arr){

        if(now_cnt == arr.length) {
            System.out.println("人数已近满了");
            return;
        }
        System.out.println("请输入学生的学号 姓名 年龄:");
        Scanner sc = new Scanner(System.in);
        String id =  sc.next();
        String name = sc.next();
        int age = sc.nextInt();
         
        for (int i = 0; i < now_cnt; i++) {
            if(id == arr[i].getId()){
                System.out.println("学号重复 输入错误");
                return;
            }
        }
         
            arr[now_cnt++] = new Student(id,name,age);
            System.out.println("添加成功");
            return;
       
        
    }

    public static void print_Student(Student[] arr){
        for (int i = 0; i < now_cnt; i++) {
            System.out.println("学号:" + arr[i].getId() + "姓名:" + arr[i].getName() + "年龄:" + arr[i].getAge());
        }
        System.out.println("打印成功");
    }

    public static void delete_Student(Student[] arr,String id){

        for (int i = 0; i < now_cnt; i++) {
            if(id == arr[i].getId()){

                for(int j = i+1;j < now_cnt;j++){
                    arr[j-1] = arr[j];
                }
                --now_cnt;
                System.out.println("删除成功");
                return;
            }
        }

        System.out.println("删除错误 没有这个人");

        return;

    }


    public static void quary_Student(Student[] arr,String id){

        for (int i = 0; i < now_cnt; i++) {
            if(id == arr[i].getId()){
                System.out.println("查询成功!");
                arr[i].setAge(arr[i].getAge()+1);
                return;
            }
        }

        System.out.println("查询失败!");


    }

}

更多推荐