• Java面向对象(基础)-- 属性赋值过程、JavaBean和UML类图


    一、类中属性赋值过程

    (1)实例变量与非实例变量

    【实例变量】

    每个对象(实例)都有一份。

    比如:

    public class UserTest {
        public static void main(String[] args) {
            User u1=new User(); //u1有一份实例变量
            User u2=new User(); //u2也有一份实例变量
        }
    }
    
    class User{
        //属性(或实例变量) 实例-->对象   创建类的实例-->创建类的对象    实例变量-->下面两个变量归具体的对象所拥有
        String name;    //成员变量
        int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    【非实例变量】

    以后还会说到非实例变量,只要变量被static修饰了,它就是静态变量(类变量),这个变量的特点就是,对象共用这一个变量。

    比如:

    public class UserTest {
        public static void main(String[] args) {
            User u1=new User(); 
            User u2=new User(); 
        }
    }
    
    class User{
        String name;    //成员变量
        static int age;	//u1与u2共用这一个变量
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (2)实例变量赋值过程

    1. 在类的属性中,可以有哪些位置给属性赋值?

    (对象创建时的赋值操作)
    ① 默认初始化;
    ② 显式初始化;
    ③ 构造器中初始化;

    …………………………………………………………………………

    (对象创建以后的赋值操作)

    ④ 通过"对象.方法"的方式赋值;(比如set方法)

    ⑤ 通过"对象.属性"的方式赋值;(属性不要私有)

    1. 这些位置执行的先后顺序是怎样?

    【猜测】
    ① - ② - ③ - ④/⑤

    【实操】

    ①默认值

    public class UserTest {
        public static void main(String[] args) {
            User u1=new User(); //u1有一份实例变量
            System.out.println(u1.age);
        }
    }
    class User{
        //属性(或实例变量) 
        String name;    
        int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    image.png

    ②显示赋值

    public class UserTest {
        public static void main(String[] args) {
            User u1=new User(); //u1有一份实例变量
            System.out.println(u1.age);
        }
    }
    class User{
        //属性(或实例变量) 
        String name;    
        int age=1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    image.png

    显示赋值可以覆盖默认值。①->②

    ③构造器中赋值

    public class UserTest {
        public static void main(String[] args) {
            User u1=new User(); //u1有一份实例变量
            System.out.println(u1.age);
    
            User u2=new User(2);
            System.out.println(u2.age);
        }
    }
    class User{
        String name;    //成员变量
        int age=1;
    
        public User(){
    
        }
        public User(int a){
            age=a;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果:
    image.png

    ②->③

    ④与⑤不用测了,因为有了①、②、③才能有④、⑤。

    1. 以上操作在对象创建过程中可以执行的次数如何?

    只能执行一次:①、②、③

    可以多次执行:④、⑤

    public class UserTest {
        public static void main(String[] args) {
            User u1=new User(); //u1有一份实例变量
            System.out.println(u1.age);
    
            User u2=new User(2);
            System.out.println(u2.age);
            u2.age=3;
            u2.age=5;//可以多次调用,也可以通过方法调用
        }
    }
    class User{
        String name;    //成员变量
        int age=1;
    
        public User(){
    
        }
        public User(int a){
            age=a;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    (3)深层剖析

    【举例】

    昨天写了一个案例,拿过来说一下。

    跳转链接:https://blog.csdn.net/m0_55746113/article/details/134002260?spm=1001.2014.3001.5501

    这一段代码:

    【Customer.java】

    package anli;
    
    /**
     * ClassName: Customer
     * Package: anli
     * Description:
     * a. 声明三个私有对象属性:firstName、lastName和account。
     * b. 声明一个公有构造器,这个构造器带有两个代表对象属性的参数(f和l)
     * c. 声明两个公有存取器来访问该对象属性,方法getFirstName和getLastName返回相应的属性。
     * d. 声明setAccount 方法来对account属性赋值。
     * e. 声明getAccount 方法以获取account属性。
     * @Author 雨翼轻尘
     * @Create 2023/10/23 0023 12:37
     */
    public class Customer {
        //属性
        private String firstName;
        private String lastName;
        private Account account;    //account是自定义类属性
        //在一个类(Customer)里面可以声明另外一个类(Account)的成员变量,
        // 另外这个类可以是系统提供现成的(比如String),也可以是自定义类(Account)
    
    
        //构造器
        //在创建对象的时候,并没有给account赋值,此时account是NULL,可以在下面的方法中对account属性赋值
        public Customer(String f,String l){
            firstName=f;
            lastName=l;
        }
    
        //方法
        //1.针对姓名只有get方法(相当于给名字属性私有化之后,并没有提供set方法,就是一旦设置好之后就不允许再改变了)
        public String getFirstName(){
            return firstName;
        }
        public String getLastName(){
            return lastName;
        }
    
        //2.针对account提供get和set方法
        public void setAccount(Account a){
            account=a;
        }
        public Account getAccount(){
            return account;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    <1> firstName和lastName

    image.png

    <2>account

    image.png


    <3>字节码文件

    以前我们找字节码文件都要在out文件夹下面找:

    image.png

    现在我们安装一个插件,用来解析字节码文件。

    “文件”–> “设置”:

    image.png

    “插件”–>Markerplace–>搜索jclasslib,安装即可:

    image.png


    比如我现在想看User类的字节码文件,就把光标放在User类的大括号中间任何一个位置

    image.png

    然后点击这里,编译一下:

    image.png

    刚才安装完插件之后,在“视图”下面就可以看见它,点击:

    image.png

    看一下:

    image.png

    字节码文件中,它将构造器转化为了一种特殊的方法–init方法。

    比如这个User构造器:

    image.png


    再说明一下:

    image.png

    二、JavaBean的理解

    • JavaBean是一种Java语言写成的可重用组件。
      • 好比你做了一个扳手,这个扳手会在很多地方被拿去用。这个扳手也提供多种功能(你可以拿 这个扳手扳、锤、撬等等),而这个扳手就是一个组件。
    • 所谓JavaBean,是指符合如下标准的Java类:
      • 类是公共的 (public)
      • 有一个无参的公共的构造器
      • 有属性,且有对应的get、set方法

    【举例】
    image.png

    【实例】

    举个实际案例:

    image.png

    后期在造具体对象的时候,把对象所属的类都设置为JavaBean,方便写出偏同一性的代码(都用空参构造器,都用set方法去设置)。

    【Customer.java】

    package yuyi;
    
    import java.sql.Date;
    
    /**
     * ClassName: Customer
     * Package: yuyi
     * Description:
     * 所谓JavaBean,是指符合如下标准的Java类:
     *   ○ 类是公共的 (public)
     *   ○ 有一个无参的公共的构造器
     *   ○ 有属性,且有对应的get、set方法
     * @Author 雨翼轻尘
     * @Create 2023/10/24 0024 16:35
     */
    public class Customer {
        //1.类是公共的 public
        
        //2.此时默认构造器就是无参公共的,可写可不写
        public Customer(){
    
        }
        
        //3.属性
        private int id;
        private String name;
        private String email;
        private Date birth;
        
        //id
        public void setId(int i){
            id=i;
        }
        public int getId(){
            return id;
        }
        
        //name
        public void setName(String n){
            name=n;
        }
        public String getName(){
            return name;
        }
        
        //email
        public void setEmail(String e){
            email=e;
        }
        public String getEmail(){
            return email;
        }
        
        //birth
        public void setBirth(Date d){
            birth=d;
        }
        public Date getBirth(){
            return birth;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何 改变。
    • 《Think in Java》中提到,JavaBean最初是为Java GUI的可视化编程实现的。你拖动IDE构建工具创 建一个GUI 组件(如多选框),其实是工具给你创建Java类,并提供将类的属性暴露出来给你修改 调整,将事件监听器暴露出来。

    三、读懂UML类图

    • UML(Unified Modeling Language,统一建模语言),用来描述 软件模型架构 的图形化语言。
    • 常用的UML工具软件有 PowerDesinger 、 Rose 和 Enterprise Architect 。

    比如用PowerDesinger画的:
    image.png

    • UML工具软件不仅可以绘制软件开发中所需的各种图表,还可以生成对应的源代码。
    • 在软件开发中,使用 UML类图 可以更加直观地描述类内部结构(类的属性和操作)以及类之间的关系(如关联、依赖、聚合等)。
      • +表示 public 类型, - 表示 private 类型,#表示protected类型 ,没写就是缺省(很少)
      • 方法的写法: 方法的类型(+、-) 方法名(参数名: 参数类型):返回值类型
      • 斜体表示抽象方法或类。
      • 若方法有下划线,则是构造器,括号里面是形参名,形参类型。(构造器没有返回值)

    image.png

    Account(init balance:double) :是构造器,括号里面是形参名,形参类型。(构造器没有返回值)

    getBalance():double :该方法返回值类型是double(冒号后面)。

    deposit(amt:double) :该方法小括号里面是形参名和形参的类型,小括号后面没有冒号表示这个方法返回值类型是void。

    目前只需要能看得懂UML类图就好了。

  • 相关阅读:
    C语言 Cortex-A7核 PWM实验
    Python Socket 基础多用户编程
    QML(25)——文本输入框组件的区别(TextField TextInput TextArea TextEdit)
    games101-3 BRDF101
    flink 分区策略
    Day08React——第八天
    C# 虚方法
    OpenCV教程:cv2图像逻辑运算
    如何提高项目决策的科学性和效率?
    【APUE】文件系统 — 类 du 命令功能实现
  • 原文地址:https://blog.csdn.net/m0_55746113/article/details/134016731