面向对象(封装)

面向对象(封装)

一、构造函数

用来构造对象的函数

当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法。这个无参数的构造方法叫做缺省构造器。

正因为有无参构造,所以我们才能通过new 类名()构造对象

有参构造的方法:public 类名(参数列表){}

  • 用构造函数给成员变量赋值

package com.homework.Day05.DemoWechat;
​
public class Testwechat {
    public static void main(String[] args) {
        WeChat wc=new WeChat("wushiwyz","13209470343","吴彦祖");
        System.out.println(wc.name);
        System.out.println(wc.nick);
        System.out.println(wc.phoneNum);
    }
​
}
package com.homework.Day05.DemoWechat;
​
public class Wechat {
    String wechatID;
    String phoneNum;
    String nick;
    public WeChat(String wechatID1,String phoneNum1,String nick1){
        wechatID=wechatID1;
        phoneNum=phoneNum1;
        nick=nick1;
    }
}

前面我们学习了两种自定义类的用法

用自定义类型声明成员变量

把自定义类类型声明成成员方法中的参数类型

把这两种方法结合一下有参构造函数,用自定义类型参数给构造方法传参,然后构造方法给成员变量赋值

package com.szwollf.Day05.DemoGZ;
​
public class Nick {
    String name;
}
​
package com.szwollf.Day05.DemoGZ;
​
public class WeChat {
    String wechatID;
    String phoneNum;
    Nick nk2;//自定义类型成员变量
    public WeChat(String wechatID1,String phoneNum1,Nick nk1){
        wechatID=wechatID1;//                  自定义参数类型
        phoneNum=phoneNum1;
        nk2=nk1;
        System.out.println(nk2.name);
    }
}
​
package com.szwollf.Day05.DemoGZ;
​
public class TestWeChat {
    public static void main(String[] args) {
        Nick nk1=new Nick();
        nk1.name="吴彦祖";
        WeChat wc=new WeChat("wushiwyz","13209470343",nk1);
        System.out.println(wc.wechatID);
        System.out.println(wc.phoneNum);
    }
}
输出结果;
吴彦祖
wushiwyz
13209470343

总结:

构造函数的修饰符可以不写

构造函数没有返回值,也不能写void

一个类没有自定义构造函数,系统会生成一个隐式的默认的无参数的构造函数

一个类中有多个构造函数,肯定是方法的重载overload

构造函数的名字,是类名

构造函数可以接收自定义类型参数

二、封装

封装的作用有两个: 第一个作用:保证内部结构的安全。 第二个作用:屏蔽复杂,暴露简单。 一个类体当中的数据,假设封装之后,对于代码的调用人员来说,不需要关心代码的复杂实现,只需要通过一个简单的入口就可以访问了。另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问,来保证数据的安全性。

封装的步骤:

第一步,属性私有化(使用private关键字进行修饰),

第二步:对外提供简单的操作入口。1个属性对外提供两个set和get方法。外部程序只能通过set方法修改,只能通过get方法读取,

可以在set方法中设立关卡来保证数据的安全性。set和get方法都是实例方法,不能带static。不带static的方法称为实例方法,实例方法的调用必须先new对象。

set和get方法写的时候有严格的规范:
        set方法:
            public void set+属性名首字母大写(1个参数){
                this.xxx = 1个参数;
            }
        get方法:
            public 返回值类型 get+属性名首字母大写(无参){
                return xxx;
            }

 

set方法往往用于用户改值

构造方法赋值通常是给实例属性一个初始值

三、this关键字

为什么要用this,我们想在构造方法运行时给成员变量赋值,比如

public class Person {
    String name;
​
    public Person(String name){
        name=name;//这里就后很难分清哪个是传递进来的name
        p.name=name;//于是我们可能想这样写就好区分了,但是这样逻辑有问题,我们是先写了赋值语句,后new的对象,在这里p还不存在,而且这样写,扩展性也不好,换个对象就得改个名字,
        this.name=name//意思就是 把name赋值给这个对象的name,这个对象即为调用该构造函数的那个对象
    }
    public void fun(){
        System.out.println(this.name);
}
} 
Person p=new Person(String name);//在这里我们想给新创建的对象赋值一个name

除了this.成员变量外还可以使用this.方法

public class TestPerson {
    public static void main(String[] args) {
        Student s=new Student();
        //s.fun();
        this.fun();
    }
}

this总结:

  • 在set中使用this

  • 构造函数中this的使用

  • this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的构造方法,目的是代码复用。

四、static静态

静态就是不动的,类似模具

所以静态修饰的代码都和类相关

static可以修饰成员变量--类变量

static可以修饰成员方法--类方法

static可以修饰类------------内部类

static语法:

static修饰的内容,是通过 类名.属性(方法(参数列表))调用的

总结:

即使用了对象名调用,本质也是该对象对应的类名在调用

静态的方法只能调用静态的成员(成员变量和成员方法)

如果某个成员变量是公用的,建议用static修饰成员变量

五、代码加载顺序

1.静态代码块(只会执行一次)

2.非静态代码块

3.构造函数

posted @ 2019-09-21 21:05  Wollf  阅读(167)  评论(0)    收藏  举报