面向对象(封装)
用来构造对象的函数
当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法。这个无参数的构造方法叫做缺省构造器。
正因为有无参构造,所以我们才能通过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.构造函数



浙公网安备 33010602011771号