day13 构造方法,this关键字和多类合作

1. 构造方法【鸡肋】

1.1 作用

用于在开发过程中创建对象使用,创建对象目前的格式

new 类名(可能用到的参数);

类名(有可能用到的参数);这就是构造方法 Constructor

初始化当前创建对象中的成员变量数据!!

1.2 格式

格式:

    public 类名(所需初始化参数列表) {

        初始化语句;

    }

细节:

    1.构造方法的名字必须是类名,并且其他方法的名字不能是类名

    2.构造方法没有返回值类型声明

    3.初始化参数列表和正常的方法列表操作使用一致

    4.初始化语句,大多数是一些赋值语句

1.3 貌似我们昨天没有写构造方法,但我们用了【了解】

首先

    在Eclipse的项目所在文件夹中,bin目录是存放当前java程序对应的所有.class 二进制文件(字节码文件),赶文件保存了java文件对应的所有内容

    这里可以通过返编译工具看到一些特定的现象【了解】

    Java -c -1 -private XXX.class

Java编译器行为

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

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

格式:

    public 类名(所需初始化参数列表){

        初始化语句;

    }

需求:

    1.完成对于姓名在创建对象时初始化的构造方法

    2.完成对于姓名,年龄创建对象时初始化的构造方法

    3.完成对于姓名,年龄,性别创建对象时初始化的构造方法

注意:

    如果在代码中程序员自行完成了构造方法,java编译器不再自动生成无参构造方法。

【强制要求】

    以后代码无论在什么时候都要给用户提供一个无参数构造方法使用

package com.qianfeng.a.Object;

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;

    }


    //成员方法

    public void eat() {

        System.out.println("吃骨头");

    }


    public void sleep() {

        System.out.println("狗睡觉");

    }


    public void game() {

        System.out.println("狗狗玩球");

    }

}

public class Demo1{

    public static void main(String[] args) {

        /*

         * 这里调用的是一个无参构造方法

         * 该方法在Dog类内是没有定义的

         *

         * 以后用的比较多的情况大多数都是无参构造方法

         *

         * The constructor Dog() is undefind

         */

        //无参构造方法

        Dog dog = new Dog();

        System.out.println(dog.name);

        System.out.println(dog.age);

        System.out.println(dog.gender);


        System.out.println("------------------");


        Dog dog1 = new Dog("聂亮");

        System.out.println(dog1.name);

        System.out.println(dog1.age);

        System.out.println(dog1.gender);


        System.out.println("------------------");


        Dog dog2 = new Dog("聂亮", 22);

        System.out.println(dog2.name);

        System.out.println(dog2.age);

        System.out.println(dog2.gender);


        System.out.println("------------------");


        Dog dog3 = new Dog("聂亮", 22, '男');

        System.out.println(dog3.name);

        System.out.println(dog3.age);

        System.out.println(dog3.gender);


    }

}

1.5 总结

1.构造方法

    功能是用于初始化创建对象的成员变量数据

    构造方法是一个方法,参数使用方式和方法一致

2.构造方法选择

    Java编译器会根据构造方法中的的【参数类型,个数,顺序】来做选择,如果没有指定的构造方法,报错!!

3.无论什么时候一定要给当前类提供一个无参数构造方法

4.以下代码报错

    Dog(String name);

    Dog(String color);

    调用:

        String color = “red”;

        Dog dog = new Dog(color);

    在java代码中不允许出现相同数据类型,个数,顺序的构造方法,和参数名没有关系,java编译器选择过程中,有且只针对数据类型,个数,顺序选择,参数名无所谓。

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

3. this关键字【鸡肋】

3.1 this关键字【重点】

this关键字表示对象本身

    1.调用当前方法的类对象

    2.通过构造方法创建的类对象

this表示一个对象!!!当前对象

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

可以在方法中使用this关键字区分操作的是成员变量还是局部变量

package com.qianfeng.a.constructor;

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.name = name;

        this.age = age;

    }


    public void test() {

        //表示调用当前方法的类对象

        System.out.println("test:" + this);

    }

}

public class Demo3 {

    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 封装,不单单是对于类的封装

归纳总结!!!

    循环封装过程

    方法封装过程

    类封装数据

    框架封装模块

    一段代码使用了3遍,做成一个循环

    一个循环使用了3遍,做成一个方法

    一个方法使用了3遍,做成一个工具类

    一个工具类使用了3遍,做成一个文档

 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 com.qianfeng.a.constructor;

/*

* 以后开发中一个【实体类】如何封装如何书写

* 实体类:

*         真实存在的一个数据,人,狗,英雄

*/

class LOLHero {

    private String name;

    private float hp;

    private float mp;


    //根据个人需求完成对应构造方法,setter和getter方法

    //Shift + Alt + s

    public LOLHero() {}


    public LOLHero(String name, float hp, float mp) {

        this.name = name;

        this.hp = hp;

        this.mp = mp;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public float getHp() {

        return hp;

    }

    public void setHp(float hp) {

        this.hp = hp;

    }

    public float getMp() {

        return mp;

    }

    public void setMp(float mp) {

        this.mp = mp;

    }

}

4.3.4 关于javaBean规范总结

javaBean规范制定的要求

    1.要求java中所有实体类成员变量全部私有化,最少提供一个无参数构造方法,对成员变量实现setter和getter方法

    2.javaBean规范,是为了后期开发汇总更好的代码适配度,提高代码运行的统一性,能够满足框架的使用

    3.javaBean规范只是一个规范,而且是作为一个基础规范,操作都是可以使用快捷键来完成的!!

4. 多类合作【重点】

5.1 汽车类和修理厂类分析

汽车

    可以看作是一个类

        成员变量:

        名字

        颜色

        轮胎个数

    成员方法:

        飙车

        飙车要有要求,轮胎个数必须为4

修理厂

    可以看作是一个类

    成员变量:

        名字

        地址

        联系方式

    成员方法:

        修理汽车的方法【重点】

            该方法是需要一个汽车类的对象

5.2 汽车类代码实现

package com.qianfeng.b;

/*

* 汽车

*     可以看作是一个类

*     成员变量:

*         名字

*         颜色

*         轮胎个数

*

*     成员方法:

*         飙车

*             飙尘有要求,轮胎个数必须为4

*/

public class Car {

    //成员变量 Field

    private String name;

    private String color;

    private int wheelCount;


    //构造方法

    public Car() {}


    public Car(String name, String color, int wheelCount) {

        this.name = name;

        this.color = color;

        this.wheelCount = wheelCount;

    }


    /**

     * 飙车方法,如果轮胎数不为4,提示需要找修理厂

     */

    public void race() {

        if (4 == wheelCount) {

            System.out.println("开着" + color + "的" + name + "骊山弯道飙车时速280KM/H");

        } else {

            System.out.println("缺少轮胎,快去修理厂!");

        }

    }

    //setter和getter方法 Method

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getColor() {

        return color;

    }

    public void setColor(String color) {

        this.color = color;

    }

    public int getWheelCount() {

        return wheelCount;

    }

    public void setWheelCount(int wheelCount) {

        this.wheelCount = wheelCount;

    }

}

5.3 修理厂类代码实现

package com.qianfeng.b;

/*

* 修理厂

*     可以看作是一个类

*     成员变量:

*         名字

*         地址

*         电话

*

*     成员方法:

*         修理汽车的方法【重点】

*             该方法是需要一个汽车类对象

*/

public class Factory {

    //成员变量

    String name;

    String address;

    String tel;


    //构造方法

    public Factory() {}


    public Factory(String name, String address, String tel) {

        this.name = name;

        this.address = address;

        this.tel = tel;

    }


    /*

     *修理汽车方法分析

     *权限修饰符

     *    public

     *返回值类型

     *    void

     *方法名

     *    repair

     *形式参数列表【重点】

     *     1.这里需要一个汽车作为参数

     *     2.而且是必要参数

     *     3.这里需要的是一个汽车类对象

     *    (Car car)这里是一个汽车类对象

     *方发声明

     *    public void repair(Car car)

     */

    /**

     * 修理汽车的方法,需要的参数是一个汽车Car类对象

     *

     * @param car  Car类对象

     * @throws InterruptedException

     */

    public void repair(Car car) throws InterruptedException {

        if (car.getWheelCount() < 4) {

            System.out.println("缺少轮胎,需要修理");


            //修改当前汽车对象的轮胎个数,赋值为4

            car.setWheelCount(4);


            //报错,com + 1 选择第一个回车

            Thread.sleep(1000);


            System.out.println("¥100000");

        } else {

            System.out.println("脑子进书了");

        }

    }


    //setter和getter方法 Method

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getAddress() {

        return address;

    }

    public void setAddress(String address) {

        this.address = address;

    }

    public String getTel() {

        return tel;

    }

    public void setTel(String tel) {

        this.tel = tel;

    }    

}

5.4 主方法代码

package com.qianfeng.b;

public class Demo {

    public static void main(String[] args) throws

    InterruptedException{

        /*

         * 同包package内可以直接使用对应的class类

         */

        Car car = new Car("特斯拉", "黑色", 4);


        for (int i = 0; i < 10; i++) {

            car.race();


            /*

             * 让程序暂停0.5s,存在一个红色的报错。这里Ctrl + 1

             * 快速修复,选择第一个

             */

            Thread.sleep(500);

        }

        Thread.sleep(1000);


        System.out.println("轮胎爆一个");

        //轮胎爆一个

        car.setWheelCount(3);


        Thread.sleep(1000);

        car.race();


        //现在需要一个修理厂对象

        Factory factory = new Factory();


        factory.setAddress("劳动路转盘");

        factory.setName("狂人修车");

        factory.setTel("18629433943");


        /*

         * 这里需要通过Factory类对象,调用repair方法,修理汽车Car类对象

         */

        factory.repair(car);


        for (int i = 0; i < 10; i++) {

            car.race();


            Thread.sleep(500);

        }

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276