java创建对象new后面为啥可以传入参数_java打卡14 面向对象2.0

08f93ff78deac9bddaba7dd9e636e90d.png

1. 构造方法【鸡肋】

1.1 作用

    用于在开发过程中创建对象使用,创建对象目前的格式
    new 类名(有可能使用到的参数);
    
    类名(有可能使用到的参数); 这就是构造方法 Constructor
    
    初始化当前创建对象中的成员变量数据!!!

1.2 格式

格式:
    public 类名(所需初始化参数列表) {
        初始化语句;
    }
细节:
    1. 构造方法的名字必须是类名,并且其他方法的名字不能是类名
    2. 构造方法没有返回值类型声明
    3. 初始化参数列表和正常的方法列表操作使用一致
    4. 初始化语句,大多数是都是一些赋值语句

1.3 貌似我们昨天没有写构造方法,但是我们用了[了解]

首先
    在Eclipse项目所在文件夹中,bin目录是存放当前Java程序对应的所有的.class 二进制文件(字节码文件),该文件保存了Java文件对应的所有内容
    这里可以通过反编译工具看到一些特定的现象 [了解]
    javap -c -l -private XXX.class

0c58233dd0385beefe24f9885b32248a.png
Java编译器行为
    在代码中任何没有【显式】自行声明构造方法,Java编译器会在编译代码的过程中辅助程序员完成一个无参数的构造方法,供程序员使用

1.4 根据需求完成所需构造方法

格式:
    public 类名(所需初始化参数列表) {
        初始化语句;
    }
需求:
    1. 完成对于姓名在创建对像时初始化的构造方法
    2. 完成对于姓名,年龄创建对象时初始化的构造方法
    2. 完成对于姓名,年龄,性别创建对象时初始化的构造方法    
    
注意:
    如果在代码中程序员自行完成了构造方法,Java编译器不再提供自动生成的无参数构造方法。
​
【强制要求】
    以后代码中无论什么时候都要给用户提供一个无参数构造方法使用
package com.qfedu.a.constructor;
​
class Dog {
    // 成员变量 Field
    String name;
    int age;
    char gender;
    
    // 无参数构造方法
    public Dog() {}
    
    // 完成对于姓名在创建对像时初始化的构造方法
    public Dog(String n) {
        // 成员变量可以在类内其他中直接使用【80%正确】
        name = n;
    }
    
    // 完成对于姓名,年龄创建对象时初始化的构造方法
    public Dog(String n, int a) {
        name = n;
        age = a;
    }
    
    // 完成对于姓名,年龄,性别创建对象时初始化的构造方法    
    public Dog(String n, int a, char g) {
        name = n;
        age = a;
        gender = g;
    } 
    
    // 成员方法 Method
    public void eat() {
        System.out.println("狗狗吃狗粮");
    }
    
    public void game() {
        System.out.println("狗狗玩球");
    }
    
    public void sleep() {
        System.out.println("狗狗作息非常规律");
    }
}
​
public class Demo1 {
    public static void main(String[] args) {
        /*
         *  这里调用的是一个无参数构造构造方法
         *  但是该方法在Dog类内是没有定义的!!!
         *  
         *  以后使用比较多的情况大多数都是无参数构造方法
         *  
         *  The constructor Dog() is undefined
         *  构造方法Dog()未定义
         */
        // 无参数构造方法
        Dog dog = new Dog();
        System.out.println("Name:" + dog.name);
        System.out.println("Age:" + dog.age);
        System.out.println("Gender:" + dog.gender);
        
        System.out.println("-------------------------------");
        
        Dog dog2 = new Dog("骚杰");
        System.out.println("Name:" + dog2.name);
        System.out.println("Age:" + dog2.age);
        System.out.println("Gender:" + dog2.gender);
        
        System.out.println("-------------------------------");
​
        Dog dog3 = new Dog("骚杰", 66);
        System.out.println("Name:" + dog3.name);
        System.out.println("Age:" + dog3.age);
        System.out.println("Gender:" + dog3.gender);
        
        System.out.println("-------------------------------");
        
        Dog dog4 = new Dog("测试", 66 , '男');
        System.out.println("Name:" + dog4.name);
        System.out.println("Age:" + dog4.age);
        System.out.println("Gender:" + dog4.gender);
        
        System.out.println("-------------------------------");
    }
}

1.5 总结

1. 构造方法
    功能是用于初始化创建对象的成员变量数据
    构造方法是一个方法,参数使用方式和方法一致
​
2. 构造方法选择
    Java编译器会根据构造方法中的【参数类型,个数,顺序】来做选择,如果没有指定的构造方法,报错!!!
​
3. 无论什么时候一定要给当前类提供一个无参数构造方法。
​
4. 以下代码报错
    Dog(String name);
    Dog(String color);
​
    调用:
        String color = "red";
        Dog dog = new Dog(color);
    在Java代码中不允许出现相同数据类型,个数,顺序的构造方法,和参数名没有关系,Java编译器选择过程中,有且只针对数据类型,个数,顺序选择,参数名真的无所谓。

2. 类对象内存分析图【重点】

4cd795be2483e0655e8c96e27933224c.png

3. this关键字【鸡肋】

3.1 this关键字【重点】

this关键字表示对象本身
    1. 调用当前方法的类对象
    2. 通过构造方法创建的类对象
​
this表示一个对象!!!当前对象!!!

3.2 目前this关键字解决的问题

可以在方法中使用this关键字区分操作的是成员变量还是局部变量
package com.qfedu.b_this;
​
class Person {
    String name;
    int age;
    
    public Person() {
        // this关键字表示通过new + 构造方法创建的类对象本身
        System.out.println("Constructor: " + this);
    }
    
    public Person(String name) {
        /*
         *  以下操作是没有用的,这是自娱自乐!!!
         *  这里存在一个【就近原则】问题,如果出现和成员变量
         *  同名的局部变量,采用就近原则
         */
        // name = name;
        
        /*
         *  这里需要赋值操作的是当前类对象中的name成员变量
         *  this.成员变量名字 表示使用的就是当前类对象的成员变量,而不是方法的参数
         */
        this.name = name;
    }
    
    public Person(String name, int age) {
        /*
         * 使用this关键字区分成员变量和局部变量
         */
        this.name = name;
        this.age = age;
    }
    
    public void test() {
        // 表示调用当前方法的类对象
        System.out.println("test: " + this);
    }
}
​
public class Demo1 {
    public static void main(String[] args) {
        Person person = new Person();
        
        System.out.println("main: " + person);
        person.test();
        
        // PFSP private final static Person
    }
}

4. 封装【重点,规范】

4.1 面向对象三大特征

封装
    最基本的思想
继承
    子承父业,你长得真的像你父母
多态
    猫,狗,都是动物
    U盘,键盘,鼠标,都是USB设备
    【最难的是多态,最简单的也是多态】

4.2 封装,不单单是对于类的封装

归纳总结!!!
    循环封装过程
    方法封装功能
    类封装数据
    框架封装模块
​
    一段代码使用了三遍,做成一个循环
    一个循环使用了三遍,做成一个方法
    一个方法使用了三遍,做成一个工具类
    一个工具类使用了三遍,做成一个文档
    一个文档使用了三遍,做成一篇博客

4.3 Java中规范化封装【JavaBean规范】

要求:
    1. 所有的成员变量全部私有化【private修饰】
    2. 要求至少完成一个无参数构造方法,其他无所谓
    3. 要求给予所有的成员变量对应的setter和getter方法

4.3.1 权限修饰符

private
    私有化内容,使用private修饰的成员变量,成员方法和构造方法,有且只能类内使用,类外没有操作权限。
    使用private修饰的内容有且只能在class所处大括号以内使用
public
    公开内容,只要存在对应的类对象,都可以通过类对象调用类内的public修饰的成员变量和成员方法

4.3.2 解决私有化成员变量赋值和取值操作问题

private私有化修饰的成员变量,类外不能通过类对象操作,取值,赋值。
​
JavaBean规范规定了
    setter ==> 赋值操作
    格式:
        public void set成员变量名(对应成员变量数据类型参数) {
            赋值操作;
        }
    getter ==> 取值操作
        public 对应成员变量数据类型返回值 get成员变量名字() {
            return 成员变量;
        }
​
注意
    1. 方法格式固定,setter和getter方法操作过程不能修改
    2. 方法需要符合命名规范,小驼峰命名法
    3. boolean类型数据较特殊
        boolean类型的成员变量getter方法要求是is开头

4.3.3 可以使用快捷方式快速完成代码

package 

4.3.4 关于JavaBean规范的总结

JavaBean规范制定的要求
    1. 要求Java中的所有实体类成员变量全部私有化,最少提供一个无参数构造方法,对应成员变量实现setter和getter方法
    2. JavaBean规范,是为了后期开发汇总更好的代码适配度,提高代码运行的统一性,能够满足框架的使用
    3. JavaBean规范只是一个规范,而且是作为一个基础规范,操作都是可以使用快捷键来完成的!!!

5. 多类合作【重点】

5.1 汽车类和修理厂类分析

汽车
    可以看做是一个类
    成员变量:
        名字
        颜色
        轮胎个数
        
    成员方法:
        飙车
            飙车有要求,轮胎个数必须是4个
修理厂
    可以看做是一个类
    成员变量:
        名字
        地址
        联系方式
    成员方法:
        修理汽车的方法【重点】
            该方法是需要一个汽车类的对象

5.2 汽车类代码实现

package 

5.3 修理厂类代码实现

package 

5.4 主方法

package 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值