Java笔记_6(面向对象)

Java笔记_6

  • 一、面向对象
    • 1.1、设计对象并使用
    • 1.2、封装
    • 1.3、就近原则和this关键字
    • 1.4、构造方法
    • 1.5、标准的JavaBean类
    • 1.6、对象内存图
    • 1.7、基本数据类型和引用数据类型
    • 1.8、this的内存原理
    • 1.9、成员和局部
  • 二、面向对象(综合练习)
    • 2.1、文字版格斗游戏
    • 2.2、对象数组
    • 2.3、键盘录入的体系
    • 2.4、对象数组2

一、面向对象

1.1、设计对象并使用

  • 类(设计图)︰是对象共同特征的描述;
  • 对象∶是真实存在的具体东西。

在Java中,必须先设计类,才能获得对象。
在这里插入图片描述
定义类的补充注意事项

  • 用来描述一类事物的类,专业叫做:Javabean类。
    在Javabean类中,是不写main方法的。

  • 在以前,编写main方法的类,叫做测试类。
    我们可以在测试类中创建javabean类的对象并进行赋值调用。

  • 类名首字母建议大写,需要见名知意,驼峰模式。

  • 一个ava文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
    实际开发中建议还是一个文件定义一个class类。

  • 成员变量的完整定义格式是∶修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。

对象的成员变量的默认值规则:
在这里插入图片描述
开发中类的设计

一般分为属性行为

根据不同的属性使用不同的类型来设计,行为同理。

1.2、封装

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

封装的好处

  • 对象代表什么,就得封装对应的数据,并提供数据对应的行为
  • 降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些方法,有需要时去找就行

理解封装思想的好处

  • 让编程变得简单,有什么事,找对象,调方法就行

private关键字

  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 被private修饰的成员只能在本类中才能访问
  • 保证数据的安全性
  • 针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
  • 提供“setXxx(参数)”方法,用于给成员变量赋值,方法用public修饰
  • 提供“getXxx()”方法,用于获取成员变量的值,方法用public修饰

1.3、就近原则和this关键字

成员变量和局部变量
在这里插入图片描述

  • 当成员变量和局部变量重名时会按照就近原则取值,这是如果加上this关键字就会选取成员变量
  • this可以区分局部变量和成员变量

1.4、构造方法

public class Student{
	修饰符 类名(参数){
		方法体;
	}
}

特点:

  1. 方法名与类名相同,大小写也要一致
  2. 没有返回值类型,连void都没有
  3. 没有具体的返回值(不能由retrun带回结果数据)

执行时机:

  1. 创建对象的时候由虚拟机调用,不能手动调用构造方法
  2. 每创建一次对象,就会调用一次构造方法

构造方法注意事项:

  1. 构造方法的定义
    • 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
    • 如果定义了构造方法,系统将不再提供默认的构造方法
  2. 构造方法的重载
    • 带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载
  3. 推荐的使用方式
    • 无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法

构造方法的种类以及作用:

  • 无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
  • 有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。

构造方法概述:

创造对象的时候,虚拟机会自动调用构造方法,作用是给成员变量进行初始化的。

1.5、标准的JavaBean类

  1. 类名需要见名知意
  2. 成员变量使用private修饰
  3. 提供至少两个构造方法
    • 无参构造方法
    • 带全部参数的构造方法
  4. 成员方法
    • 提供每一个成员变量对应的setXxx()/getXxx()
    • 如果还有其他行为,也需要写上

1.6、对象内存图

一个对象的内存图

Student s = new Student()
  1. 加载class文件
  2. 申明局部变量
  3. 在堆内存中开辟一个空间
  4. 默认初始化
  5. 显示初始化
  6. 构造方法初始化
  7. 将堆内存中的地址值赋值给左边的局部变量

两个对象的内存图
在这里插入图片描述
两个引用指向同一个对象的内存图
在这里插入图片描述

1.7、基本数据类型和引用数据类型

基本数据类型

  • 与应用数据类型的主要区别就是内存位置的不同
  • 在栈内存区域直接存放真实的数据

引用数据类型
例如对象:
在这里插入图片描述

  • 数据值是存储在其他空间中,自己空间中存储的是地址值。
  • 赋值给其他变量,赋的地址值

1.8、this的内存原理

this的作用:区分局部变量和成员变量
this的本质:所在方法调用者的地址值
在这里插入图片描述

1.9、成员和局部

区别成员变量局部变量
类中位置不同类中,方法外方法内、方法声明上
初始化值不同有默认初始化值没有,使用之前需要完成赋值
内存位置不同堆内存栈内存
生命周期不同随着对象的创建而存在,随着对象的消失而消失随着方法的调用而存在,随着方法的运行结束而消失
作用域整个类中有效当前方法中有效

二、面向对象(综合练习)

2.1、文字版格斗游戏

格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。

Role class

package object;

import java.util.Random;

public class Role {
    private String name;
    private int blood;
    private char gender;
    private String face;

    String[] boyfaces = {"帅气的","靓的","酷的","超帅的"};
    String[] girlfaces = {"美的","靓的","酷的","超靓的"};


    Random r = new Random();

    public void setFace(char gender){
        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 void attack(Role role){

        int hurt = r.nextInt(20)+1;
        int remainBoold = role.getBlood();

        remainBoold =role.getBlood() -hurt;
        remainBoold = remainBoold < 0 ? 0 : remainBoold;

        role.setBlood(remainBoold);

        System.out.println(this.getName()+"打了"+role.getName()+"一下"+"导致"+hurt
                +"点伤害"+role.getName()+"还剩下"+remainBoold+"的血量");

    }

    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 char getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }
    public String getFace() {
        return face;
    }

    public Role(String name,int blood,char gender){
        this.name = name;
        this.blood = blood;
        this.gender = gender;
        setFace(gender);
    }
    public void  showRole(){
        System.out.println("姓名为"+getName());
        System.out.println("血量为"+getBlood());
        System.out.println("性别为"+getGender());
        System.out.println("长相为"+getFace());
    }

}

执行代码

package object;

import java.util.Scanner;

public class Role_pk {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入第一个角色的名字");
        String r1_name = sc.next();
        System.out.println("请输入第一个角色的性别");
        char r1_gender = sc.next().charAt(0);
        System.out.println("请输入第二个角色的名字");
        String r2_name = sc.next();
        System.out.println("请输入第二个角色的性别");
        char r2_gender = sc.next().charAt(0);
        Role r1 = new Role(r1_name,100,r1_gender);
        r1.showRole();
        Role r2 = new Role(r2_name,100,r2_gender);
        r2.showRole();

        while (true){

            r1.attack(r2);
            if(r2.getBlood()==0){
                System.out.println(r2.getName()+"被KO了");
                break;
            }
            r2.attack(r1);

            if(r1.getBlood()==0){
                System.out.println(r1.getName()+"被KO了");
                break;
            }
        }
    }
}

2.2、对象数组

定义数组存储3个商品对象。
商品的属性:商品的id,名字,价格,库存。
创建三个商品对象,并把商品对象存入到数组当中。

package object;

public class Goods {
    private String ID;
    private String name;
    private double price;
    private int number;

    public Goods() {
    }

    public Goods(String ID, String name, double price, int number) {
        this.ID = ID;
        this.name = name;
        this.price = price;
        this.number = number;
    }
    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 double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }

}
package object;

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

        Goods good1 = new Goods("Aoo1","小米9",2999.0,100);
        Goods good2 = new Goods("Aoo2","红米k50pro",2999.0,100);
        Goods good3 = new Goods("Aoo3","红米G",5999.0,100);

        arr[0] = good1;
        arr[1] = good2;
        arr[2] = good3;

        for (int i = 0; i < 3; i++) {
            Goods goods = arr[i];
            System.out.println(goods.getID()+","+goods.getName()+","+goods.getPrice()+","+goods.getNumber());
        }
    }
}

2.3、键盘录入的体系

第一套:

//键盘录入
nextInt()//接收整数
nextDouble()//接收小数
next()//接收字符串
next().charAt(0)//接受字符
  • 遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了

第二套

nextLine()//接收字符串

2.4、对象数组2

定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。
学生的属性:学号,姓名,年龄。
要求1∶再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
要求2:添加完毕之后,遍历所有学生信息。
要求3:通过id删除学生信息如果存在,则删除,如果不存在,则提示删除失败。
要求4:删除完毕之后,遍历所有学生信息。
要求5:查询数组id为“heima002”的学生,如果存在,则将他的年龄+1岁

package object;

public class create_array {
    /*定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。
    学生的属性:学号,姓名,年龄。
            **要求1**∶再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
            **要求2**:添加完毕之后,遍历所有学生信息。
            **要求3**:通过id删除学生信息如果存在,则删除,如果不存在,则提示删除失败。
            **要求4**:删除完毕之后,遍历所有学生信息。
            **要求5**:查询数组id为“heima002”的学生,如果存在,则将他的年龄+1岁
*/
        private int number ;
        private String name;
        private int age;
    public create_array() {
    }
    public create_array(int number, String name, int age) {
        this.number = number;
        this.name = name;
        this.age = age;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    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;
    }

}

package object;

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

        create_array stu1 = new create_array(001,"xiaoming",18);
        create_array stu2 = new create_array(002,"xiaohong",18);
        create_array stu3 = new create_array(003,"xiaogang",18);

        arr[0] = stu1;
        arr[1] = stu2;
        arr[2] = stu3;

        create_array stu4 = new create_array(004,"xiaoquan",19);

        //唯一性判断
        //已存在--不用添加
        //不存在-- 就可以把学生对象添加进数组

        boolean flag=  contains(arr,stu4.getNumber());

        if(flag){
            //已存在,不用添加
            System.out.println("当前ID重复,请修复后重新进行添加");

        }else{
            int count  = getcount(arr);
            if(count == arr.length){
                //已经存满
                //创建一个新的数组,长度 = 老数组的长度 +1;
                //把老数组的元素,拷贝到新数组里
                create_array [] newArr = creatNewArr(arr);

                newArr[count] = stu4;
                printarr(newArr);
            }else {
                //没有存满
                //[stu1,stu2,stu3]
                //getcount得到的是2,表示当前数组中已经有了2个元素
                //还有一层,如果下一次要添加数组,就是添加2索引的位置
                arr[count] = stu4;

                printarr(arr);
            }
        }

        int index = getindex(arr,002);

        if(index>=0){
            arr[index]=null;

            printarr(arr);
        }else {
            System.out.println("需要删除的信息不存在");
        }

        int index2 = getindex(arr,003);

        if(index2>=0){
            create_array stu  = arr[index2];
            int newAge = stu.getAge()+1;

            stu.setAge(newAge);
            printarr(arr);
        }else {
            System.out.println("需要修改的信息不存在");
        }
    }

    public static  void printarr(create_array[] arr){

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                System.out.println("学生的学号是:" + arr[i].getNumber() + ",学生的姓名是:" + arr[i].getName() + ",学生的年龄是:" +
                        arr[i].getAge());
            }
        }
    }

    public static create_array[] creatNewArr(create_array[] arr){
        create_array[] newArr = new create_array[arr.length+1];

        for (int i = 0; i < arr.length; i++) {
                newArr[i] = arr[i];

        }
        return newArr;
    }

    public static int getcount(create_array[] arr){
        int count=0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]!=null){
                count++;
            }
        }
        return count;

    }
    public static boolean contains(create_array[] arr,int id) {
        for (int i = 0; i < arr.length; i++) {
            create_array stu = arr[i];

            if (stu!=null) {
                int sid = stu.getNumber();
                if (sid == id) {
                    return true;
                }
            }
            }
        return false;
    }

    public static int getindex(create_array[] arr,int id){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]!=null){
                if(arr[i].getNumber() == id){
                    return i;
                }
            }
        }
        return -1;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3251.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正式环境关闭swagger

直接上步骤&#xff0c;如图&#xff1a;1&#xff0c;启动判断写在相应的环境配置文件中&#xff0c;根据条件判断是否启动 swagger &#xff1a;添加配置项&#xff1a;swagger.is.enable配置文件中添加&#xff1a;#是否激活 swagger true or falseswagger.is.enabletrue2&a…

【Linux】-初识Linux

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Linux】 分享&#xff1a;逆着光行走&#xff0c;任风吹雨打。 ——《起风了》 主要内容&#xff1a;Linux的一些最基本指令&#xff0c;Linux的小程序&#xff0c;Linux关于连…

从暴力递归到动态规划(2)小乖,你也在为转移方程而烦恼吗?

前引&#xff1a;继上篇我们讲到暴力递归的过程&#xff0c;这一篇blog我们将继续对从暴力递归到动态规划的实现过程&#xff0c;与上篇类似&#xff0c;我们依然采用题目的方式对其转化过程进行论述。上篇博客&#xff1a;https://blog.csdn.net/m0_65431718/article/details/…

看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 1

Vulnhub靶机My File Server: 1渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入&#xff1a;③&#xff1a;SMB共享服务&#xf…

【微信小程序】-- 使用 Git 管理项目(五十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

【Docker】Compose容器编排LNMP上云

文章目录什么是Docker-Compose下载安装官网官网下载安装卸载Compose核心概念一文件两要素三个步骤Compose常用命令DjangoMysqlRedisNginx部署部署架构构建django容器 - - - dockerfile编写构建Nginx容器docker-compose 编排容器Django项目配置custom_webmysql容器redis容器Djan…

一文看懂数据仓库

数据仓库数据仓库的概念数据仓库的主要特征数据仓库的分层数据仓库的分层介绍原始数据层&#xff1a;ODS&#xff08;Operational Data Store&#xff09;数据仓库层&#xff1a;DW&#xff08;Data Warehouse&#xff09;数据明细层&#xff1a;DWD&#xff08;Data Warehouse…

邪恶的想法冒出,立马启动python实现美女通通下

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 完整源码、python资料: 点击此处跳转文末名片获取 当我在首页刷到这些的时候~ 我的心里逐渐浮现一个邪念&#xff1a;我把这些小姐姐全都采集&#xff0c;可以嘛&#xff1f; 答案当然是可以的~毕竟就我这技术&#xff0c…

【Java|golang】45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

不会写SQL?ChatGPT 来帮你

想必当前最火的软件就是ChaGPT了&#xff0c;它是一款基于人工智能技术的大型语言模型,在数据库方面&#xff0c;ChaGPT可以被用来进行自然语言处理&#xff0c;实现自然语言查询和分析数据库。通过将ChaGPT与数据库集成&#xff0c;可以使得数据库更加智能化&#xff0c;提高数…

【2023】Kubernetes-网络原理

目录kubernetes网络模型kubernetes网络实现容器到容器之间通信Pod之间的通信Pod到Service之间的通信集群内部与外部组件之间的通信开源容器网络方案FlannelCalicokubernetes网络模型 Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#x…

【Android -- 软技能】《软技能:代码之外的生存指南》之好书推荐(一)

前言 这是一本由美国的一个软件开发人员写的&#xff0c;但书中除了有 Java 、C# 几个单词外&#xff0c;没有一行代码。 因为这本书讲的是代码之外的东西。 文章目录结构&#xff1a; 1. 职业 从业心态&#xff1a;说白了就是要有责任心&#xff0c;把每份工作要当成是自…

【国产FPGA】国产FPGA搭建图像处理平台

最近收到了高云寄过来的FPGA板卡&#xff0c;下图&#xff1a;来源&#xff1a;https://wiki.sipeed.com/hardware/zh/tang/tang-primer-20k/primer-20k.htmlFPGA主要参数:FPGA型号参数GW2A-LV18PG256C8/I7逻辑单元(LUT4) 20736寄存器(FF) 15552分布式静态随机存储器S-SRAM(bit…

Python+Yolov5道路障碍物识别

PythonYolov5道路障碍物识别如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonYolov5道路障碍物识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与…

蓝桥杯刷题冲刺 | 倒计时15天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.年号字串2.裁纸刀3.猜生日1.年号字串 题目 链接&#xff1a; 年号字串 - 蓝桥云课 (lanqiao.c…

Java 网络编程入门

文章目录一、网络编程入门1. 网络编程三要素2. IP 地址3. InetAddress4. 端口5. 协议二、UDP 通信程序1. UDP 发送数据2. UDP 接收数据3. UDP 案例三、TCP 通信程序1. TCP 发送数据2. TCP 接收数据3. 服务器给出反馈4. 客户端录入键盘数据5. 服务器数据写入文件6. 客户端数据来…

Ubuntu使用vnc远程桌面【远程内网穿透】

文章目录1.前言2.两台互联电脑的设置2.1 Windows安装VNC2.2 Ubuntu安装VNC2.3.Ubuntu安装cpolar3.Cpolar设置3.1 Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 记得笔者刚刚开始接触电脑时&#xff0c;还是win95/98的时代&#xff0c;那时的电脑桌面刚迈入图形…

C++三种继承方式

C继承的一般语法为&#xff1a;class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&#…

Python|蓝桥杯进阶第五卷——数论

欢迎交流学习~~ 专栏&#xff1a; 蓝桥杯Python组刷题日寄 蓝桥杯进阶系列&#xff1a; &#x1f3c6; Python | 蓝桥杯进阶第一卷——字符串 &#x1f50e; Python | 蓝桥杯进阶第二卷——贪心 &#x1f49d; Python | 蓝桥杯进阶第三卷——动态规划 ✈️ Python | 蓝桥杯进阶…

Linux基本命令

相比Windows系统而言&#xff0c;在一般的企业开发中&#xff0c;使用linux系统无疑是更加广泛的&#xff0c;因此掌握常见的linux基本命令于我们来说是必要的&#xff0c;本文就是对Linux基本命令的简单介绍。 ls 列出当前目录下&#xff0c;所包含的目录及文件&#xff1b; …