----------- 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.静态方法中不可以定义this,super关键字,
因为静态优先于对象存在,所以静态方法中不可以出现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学习型技术博客、期待与您交流! ------------