黑马程序员:java课程要点-封装

来源:互联网 发布:eve欧服网络加速器 编辑:程序博客网 时间:2024/06/03 12:26

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

容器:计算机的根本功能是处理数据!数据多了就需要容器!容器是计算机的根本!
数组是容器:这个容器中存放的必须是同类型的数据
对象也是容器!这个容器中存放的可以是不同类型的数据,操作该对象就是操作数据
对象的特征:封装,继承,多态

1.封装(Encapsulation):就是隐藏对象的属性和实现细节,仅对外提供公共访问方式

好处:

将变化隔离???

便于使用???

提高重用性/复用性--???

提高安全性

封装原则:将不需要对外提供的内容都隐藏起来;把属性隐藏,提供公共方法对 其访问。

1)私有:

为了避免直接访问属性,出现错误的不符合实际描述的数据

将这个属性隐藏起来

隐藏方式有多种,其中的一种就是将其私有

私有需要通过关键字private来体现

private:是一个权限修饰符,用于修饰成员——只能修饰类中的成员变量和成员函数

葛朗台老爷家的宝贝金钟:葛朗台老爷有一个非常华丽非常贵重的中世纪遗留下来的金钟,他非常爱惜自己的金钟,每天都要擦拭好多次!他怕别人偷走,所以不请任何佣人!家里只有自己,所以能碰到金钟的只有他自己!但是记者知道了,想要出一篇报道,来报道一下!但是葛朗台不会让他接触金钟的,没办法,记者只有通过老爷来帮自己照几张照片!

金钟作为葛朗台这个对象的属性,外部不能访问,所以要私有隐藏起来,葛朗台有访问这个金钟的功能。所以,别人想要访问这个金钟,只有通过葛朗台的功能去访问!这样就保证了金钟的安全因为只有葛朗台自己在访问!

封装就是只给自家成员用,只给自家成员使用,因为只相信自家成员,不相信别家成员可以找一个专门处理外部访问的外交成员,别家成员想要访问,就找自家的外交成员,自家的外交成员可以实现一些独特的功能,比如判断访问是否合理,比如是否要转换

其他程序无法直接访问该私有成员

为便于其他程序访问,提高安全性,需要对外提供访问方式来间接访问

其实对外提供公共的访问方式是数据可控访问

以后开发,通常都将类中的属性进行私有化,对外提供方法对其进行可控访问

对属性的访问:1,设置set属性()2,获取get属性();

例如:setAge(int age); getAge(int age);

注意:私有仅仅是封装的形式之一

函数就是一种最小的封装

实体的建立必须要有初始化过程

2.构造函数:

作用:对象一建立就会调用构造函数,构造函数可以对对象进行初始化

一个对象在建立时,需要哪些内容,需要的内容可以定义在构造函数中

特殊之处:任何一个class定义的类中,没有定义构造函数的话

都有一个默认空参数空操作的构造函数

该默认构造函数是编译后的class文件自动存在的

存在的目的就是为了方便创建对象时初始化

一旦自定义了构造函数,该默认构造函数就没有了

构造函数既可以空参数,也可以有参数

所以一个类中的多构造函数的出现是以重载的形式出现的

多构造函数的出现可以对不同的对象进行针对性的初始化

构造函数跟一般函数的区别:

1,写法不同,一个有返回值,一个没有

2,运行上的不同,构造函数是在对象创建时就被调用对对象进行初始化,而且只执行一次

而一般函数是描述对象的功能,需要在创建完成后,才可以对其调用,而且可以多次调用

对象的建立需要找到对应的构造函数进行初始化,没有对应,编译失败——找不到符号

什么时候用构造函数?

分析具体事物时,事物石头已存在就具备的内容,定义在构造函数中,这样该事物在产生对象时,就具备了和享受生活中事物一样的内容

当所具备的内容不一样的时候,可以通过多个构造函数进行描述,设置不同参数的构造函数

特点:

函数名与类名相同

不能定义返回值类型

没有具体返回值

功能:

给对象进行初始化

默认构造函数的特点

多个构造函数是以重载的形式存在

私有构造函数,构造函数是成员,可以私有,私有后,可以防止外部建立该对象

任何成员被调用都要有引用

3.this关键字:哪个对象调用,this就代表该对象

应用场景1

局部变量和成员变量同名的时候,可以通过this标示成员变量

应用场景2

构造函数间进行调用也可以用this关键字,this()--this语句

this语句必须放在构造函数的第一行,因为初始化动作要先执行

栈内存溢出的现象:

Person(String name)

{

this("hehe",23);

}

Person(String name,int age)//递归调用,只进栈不出栈,最终溢出

{

this(name);

this.age=age;

}

4.static关键字:

当对象中存在很多重复的数据时,可以通过static关键字对其修饰

————实现数据的对象共享

共享数据——被静态修饰的数据要先于对象存在,所以其可以被类名调用

类是相当于规划阶段,就好比新型汽车的图纸,新型汽车要用新型能源,

好的规划应该,新型车在下线上市之前要先保证有这种能源在加油站的存在

特点:

1,随着类的加载而加载,随着类的消失而消失

2,优先于对象存在

3,被所有对象共享

4,可以直接被类名调用

静态是一个成员修饰符,既可以修饰成员变量,也可以修饰成员函数

被静态修饰的都可以被类名调用,而且可以被对象所调用

静态关键字什么时候用?

1,静态变量

当一个类产生的多个对象中的属性的中都是相同的,这时没有必要将这个值在每一个对象中都存储

这时可以将该数据定义成静态的

2,静态函数

当函数中没有访问对象中的特有数据时,就将该函数用静态修饰

!!!堆,栈,数据共享区(方法区,静态方法区)——随着类的加载而加载在其中

方法区是对象调用

静态方法区是类名调用

静态代码块:随着类的加载执行,而且只执行一次,优先于主函数执行

可以给类进行初始化

如果构造函数被私有,不能建立对象,就可能一些功能不能使用这时候如 果还需要做一些事,就要用到静态代码块

静态使用注意法则:

1.静态方法只能访问静态成员(方法和变量),

非静态方法既可以访问静态也可以访问非静态

2.静态方法中不可以定义thissuper关键字,

因为静态优先于对象存在,所以静态方法中不可以出现this

3.主函数是静态的

静态有利有弊

利:对对象的共享数据进行单独存储,节省空间;可以直接被类名调用;

弊:生命周期过长;访问出现局限性。(静态只能访问静态)

什么时候使用静态?

1.什么时候定义静态变量(类变量)呢?

  当对象中出现共享数据时,该数据被静态缩修饰。

  对象的特有数据要定义在非静态存在于堆内存中。

2.什么时候定义静态函数呢?

  当功能内部没有访问到非静态数据(对象的特有数据)

  那么该功能可以定义成静态的。需要调用的时候用类名函数名

——静态的主函数可以通过对象来访问非静态!!!

——也就是非静态方法最好定义类之中,然后建立对象来访问????

成员变量和静态变量之间的区别?

1,成员变量称为实例变量,随着对象的出现而存贮到对象中,是对象的特有数据

静态变量称为类变量,随着类的加载而加载,是对象的共享数据

2,成员变量都存储在堆内存中

静态变量都存储在方法区的静态区中

3,成员变量只能被对象所调用

静态变量可以被对象调用,也可以到被对象调用

5.单例设计模式:饿汉式,懒汉式

保证某类在内存中对象的唯一性

如何能保证一个类在内存中只有一个对象?

1.不让其他程序创建该类对象,因为这样对象数量不可控

2.在本类中自定义本类对象,自己创建

3.对外提供已创建好的数据

步骤:

1,构造函数私有化,这样其他程序就无法创建对象了,因为无法出事后

2,在本类中创建一个本类对象

3,对外提供方法对该对象进行获取

饿汉式:——开发建议用饿汉式,安全,简单

Single类一进内存,就已经创建好了对象

懒汉式:——延时加载,如果多个人同时调用getInstance可能出现问题

Single进入内存没有对象,初始值是null,只有调用getInstance时才建立对象

单例设计模式代码:

//饿汉式

class Single

{

private static Single s=new Single();

private Single(){}

public static Single getInstance()

{

return s;

}

}

//延迟加载的方式,懒汉式

class Single

{

private static Single s=null;

private Single(){}

public static Single getInstance()

{

if (s==null)

s=new Single();

return s;

}

}

class  SingleDemo

{

public static void main(String[] args) 

{

Single s1=Single.getInstance();

Single s2=Single.getInstance();//或者在s不私有时Single s2=Single.s;不过属性一般都要私有

System.out.println();

}

}

class SuperMan

{

private String name;

private int age;

private static SuperMan s=new SuperMan("Clack");

private SuperMan(String name){this.name=name;}

public static SuperMan getInstance()

{

return s;

}

public void setAge(int age)

{

this.age=age;

}

public int getAge()

{

return age;

}

}


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------