封装 2019-03-09

1 封装的初步概念(重点)

封装属于面向对象的第一大特性,对于封装性的讲解以代码的方式大家观察以下为什么要使用封装?

范例:观察没有封装操作的情况

class Person

{

 private String name ; //定义姓名 使用了private访问修饰在类的外部不能被访问

 private int age ; //定义年龄

 public void tell(){ //定义类的方法

 System.out.println("姓名"+name+",年龄"+age);

 }

}

public class TestDemo02

{

 public static void main(String[]args){

 Person per=new Person(); //声明并实例化对象

 per.name="张三";

 per.age=-30;

 per.tell();

 }

}

以上的程序,由于在没有封装的情况下数据安全性非常不好,数据可以被任意的修改,为了不让数据被用户任意的修改,把属性访问权限修改为private (只能在本类中使用),外部不可进行调用赋值

接下来的问题,如何在外部使用被private修饰的属性?

对于以上的问题,使用setter以及getter方法来进行解决


class Person

{

 private String name ; //定义姓名 使用了private访问修饰在类的外部不能被访问

 private int age ; //定义年龄

 //setter 方法

 public void setName(String n){

 name=n;

 }

 public void setAge(int a){

 if(a<18){

 a=18;

 }

 age=a;

 }

 //getter方法

 public String getName(){

 return name;

 }

 public int getAge(){

 return age;

 }

 public void tell(){ //定义类的方法

 System.out.println("姓名"+name+",年龄"+age);

 }

}

public class TestDemo02

{

 public static void main(String[]args){

 Person per=new Person(); //声明并实例化对象

 per.setName("张三");

 per.setAge(16);

 System.out.println(per.getName()); //单独输出per对象的属性名称

 System.out.println(per.getAge()); //输出年龄

 per.tell();

 }

}

以上的Person类的属性使用private关键字进行了封装,只能在本类中对private关键的属性进行访问,但是在外部通过对象调用属性的时候会出现语法错误,不允许访问 虽然此时属性是安全了,但是这些属性依然还需要被外部访问. 就java开发标准来说,必须使用setter以及getter方法来进行private修饰的属性的访问

setter以及getter方法的命名规则如下

public void setName(String n){}
Public String getName(){return name}

以后在开发编写一个类的时候,属性都需要使用private进行修饰,而为对应的属性编写setter以及getter方法

2 构造方法(重点)

在讲解构造方法之前,首先观察如下的格式

类名称 对象名称 =new 类名称();

对于以上的格式,其功能声明并且实例化一个类,下面就针对以上格式对每一个关键字进行讲解

类名称 :要定义对象的数据类型

对象名称: 对类中的属性或方法进行调用变量名称

new: 开辟内存空间

类名称(): 表示实例化对象,按照道理来讲 加上()的都是方法,即这个方法是与类名称保持一致的方法,构造方法 .这个方法与普通的方法不太一样, 构造方法是在实例化对象时使用的,而普通的方法使在实例化对象之后使用的

在java中构造方法存在相应的规则:

1 构造方法的名称与类名称保持一致

2 构造方法不允许存在返回值类型

3 实例化对象的时候,一定要有构造方法的存在(类中会提供一个默认 无参构造方法),如果显示的定义了构造方法则默认的构造方法则失去作用

范例:使用构造方法

class Person

{

 private String name ; //定义姓名 使用了private访问修饰在类的外部不能被访问

 private int age ; //定义年龄

 public Person(){

 name="张三";

 age=20;

 }

 public Person(String n,int a){

 name=n;

 age=a;

 }

 public void tell(){ //定义类的普通方法

 System.out.println("姓名"+name+",年龄"+age);

 }

}

public class TestDemo02

{

 public static void main(String[]args){

 Person per=new Person("李四",50); //声明并实例化对象

 per.tell();

 }

}

构造方法作用主要目的就是为对象赋予初始变量内容,在实例化对象的时候进行调用

3 构造方法的重载(掌握)

对于构造方法的重载,实际上在类中可以定义多个构造方法(参数的类型与个数不同)

范例:在类中定义多个构造方法

class Person

{

 private String name ; //定义姓名 使用了private访问修饰在类的外部不能被访问

 private int age ; //定义年龄

 private String sex; //定义性别

 public Person(){ //无参数的构造方法

 }

 public Person(String n,int a){ //定义两个参数的构造方法

 name=n ;

 age=a;

 }

 public Person(String n ,int a,String s){ //定义三个参数的构造方法

 name=n;

 age=a;

 sex=s;

 }

 public void tell(){ //定义类的普通方法

 System.out.println("姓名"+name+",年龄"+age);

 }

}

对于以上的代码,在实际的实例化对象的时候只要给定相应的参数,则就可以调用相应的构造方法

范例:构造方法的调用

public class TestDemo02

{

 public static void main(String[]args){

 Person per=new Person("边继斌",98,"??");

 per.tell();

 }

}

对于构造方法来说,也是可以直接在构造方法中调用普通的方法,在进行初始化赋值的时候也可以在构造方法使用setter方法进行验证

4 匿名对象(重点)

如果一个对象没有栈没存空间中进行指向,这个对象就是匿名对象,可以把匿名对象理解为只能使用一次的对象

范例:定义一个匿名对象

public class TestDemo02

{

 public static void main(String[]args){

 new Person("张三",20).tell(); //通过匿名对象来调用方法

 new Person("zhang",30).tell();

 }

}

以上的程序,通过匿名对象调用了类中的方法,由于匿名对象没有栈空间引用,使用一次之后会变为垃圾空间等待GC被回收

5 简单java类的编写(掌握)

简单java类是现在比较重要的开发模型,比如以后常见的技术框架,spring status2 mybtis 这些框架技术都是围绕着简单java进行开发的

如果现在定义的一个类指包含基本的属性,则必须为属性设置setter以及getter方法,这样的类就可以理解为简单java类,简单java类的开发原则如下:

1 类名称必须明确的表示出类的定义例如: 人类 Person 部门Dept

2 类中所有的属性必须使用private 关键字进行封装

3 类中所有的属性都必须定义相应的setter以及getter方法

4 类中可以提供构造方法,为属性初始化,不管编写了多少个构造方法,但是必须为类提供一个无参的构造方法

范例:通过一个简单的案例,编写一个简单的java类,本次编写一个雇员类

class Emp

{

 private int empno; //雇员编号

 private String ename; //雇员姓名

 private String job; //雇员职位

 private double sal ; //基本工资

 private double comm ;//奖金

 //以上为基本属性 使用private进行封装

 //编写构造方法

 public Emp(){} //无参的构造方法

 public Emp(int eno,String ena,String j,double s,double c){ //有参数的构造方法

 empno=eno;

 ename=ena;

 job=j;

 sal=s;

 comm=c;

 }

 //雇员完整信息的输出方法

 public String getInfo(){

 return "雇员信息"+"\n"+

 "\t 编号"+empno+"\n"+

 "\t 姓名"+ename+"\n"+

 "\t 职位"+job+"\n"+

 "\t 工资"+sal+"\n"+

 "\t 奖金"+comm;

 }

 //编写setter方法

 public void setEmpno(int eno){

 empno=eno;

 }

 public void setEname(String ena){

 ename=ena;

 }

 public void setJob(String j){

 job=j;

 }

 public void setSal(double s){

 sal=s;

 }

 public void setComm(double c){

 comm=c;

 }

 //编写getter方法

 public String getEname(){

 return ename;

 }

 public int getEmpno(){

 return empno;

 }

 public String getJob(){

 return job;

 }

 public double getSal(){

 return sal;

 }

 public double getComm(){

 return comm;

 }

}

public class TestDemo02

{

 public static void main(String[]args){

 Emp emp=new Emp(10,"斌斌","洗厕所",10.98,3);

 System.out.println(emp.getInfo());

 }

}

练习:编写三个类似的简单java类

总结

1 封装的基本概念主要的目的就是保证数据的安全性,使用到的关键为private ,只能本类中所访问,对private修饰的属性,需要为其编写对应setter以及getter方法

2 构造方法,为对象进行初始化的时候赋值使用的,构造方法的特点如下:

1)方法名称与类名称一致,并且没有返回值

2)类中会提供一个默认的无参的什么都不做的构造方法

3)当用户显示定义了构造方法之后默认提供的构造方法则不会生成,所以用户需要显示的定义一个无参的构造方法

4)构造方法支持方法的重载

5)匿名对象,就是一块没有栈内存空间指向的内存地址,只能使用一次,之后等待垃圾回收机制回收

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

推荐阅读更多精彩内容