Java封装
1.封装Tips
(1)封装实现步骤
(PS:下面的大段叙述,看看就行)
private 限定属性只能在当前类内被访问;
getter和setter方法也可以通过访问修饰符设置其访问范围,即这两个方法不一定非得是public的;
封装说白了,就是设置类内成员属性不可见,只提供的特定的方法作为操作这些成员属性的入口;
封装可以理解为是一种利用抽象的函数接口实现实现细节信息的包装隐藏的方式;可以把封装看成是一种保护屏障,调用者不能随意通过“变量名.属性名”的方式来修改类中的私密数据信息;
2.return语句的一个点
方法中出现return表示方法运行终止;如果方法的返回值设定的为void,也可以使用“return ;”(return后面什么也不加),直接结束方法
3.在构造方法中,调用set方法给类成员属性赋值
4.包的Tips
(1)Java中使用包管理Java文件,解决同名文件冲突问题;
(2)Java中一个包里不能存在同名的类;
(3)包命名规范:域名倒叙+模块名称+功能名称,且推荐全部小写;如com.imooc.animal;
(4)类中关于所属包的声明语句(一般是自动生成的),必须放在Java源文件的第一行;
(5)一个包中,只存储与该包功能定位相关的文件;
5.跨包的类的调用
基本情况:两个不同的包中,均有Cat类;
方案1:
方案2:该方案是有针对性的加载,效率比方案1高点;
方案3:使用的时候,直接写全路径
如果想同时访问com.imooc.animal包下的Cat类和com.imooc.mechanices包下的Cat类,应该怎么办?
下面是个错误示范:这种写法,程序识别不了,定位不清
上述问题的:
解决方案1:(这个方案也体现了,分别以*和制定类名导入时,以类名导入优先级最高)
但如果,想访问com.imooc.mechanices包下的Cat类,应该使用全路径的方式调用了:
注:import com.imooc.*;的意思是只能访问imooc包下所有的类,访问不了imooc包中animal包和mechanices包里面的类!
即导入imooc包下所有直接允许访问的类,无法导入其子包中的类;
3.常用系统包,lang、util、io罗列;
1.static-静态属性
(1)static代表“全局”或“静态”,可以理解为:方便在没有创建对象的情况下来进行某些操作。通常用于修饰成员变量和方法,也可以形成静态代码块。 实际应用中,可将需频繁操作、通用型信息设置、公共组件封装等操作设置为“静态”
static修饰的类成员属性,是该类 所有对象共享的 区域;
(2)类加载时产生,类彻底销毁时,才进行资源释放;其生命周期长,即资源占用周期长,要慎用。
(3)如下的一个示例:
2.static-静态方法
static修饰方法;通常称作静态方法、类方法、全局方法;静态方法属于整个类,由类进行维护,优先于对象而存在(因此,在静态方法中无法访问同类中的非静态成员,因为非静态成员是与对象相生相伴的)
注:
(1)static不能修饰类
(2)static不可以修饰方法中的局部变量;即不允许在方法内部定义静态局部变量(即使这个方法是静态方法也不行),(static成员是属于类的,其应该修饰处于类的“根目录”的成员)
(3)在普通成员方法中:可以访问同类中的静态方法;可以访问同类中的静态属性;因为静态成员属于类,属于类的所有对象共享的,所以类的每一个具体对象都可以访问静态成员(普通成员方法是和类对象相生相伴的),所以在下面的例子中,this.eat()是可以的(但不推荐这样做,因为static修饰的东西,是更希望用户直接用类名.eat()的方式调用的)
在静态方法中:无法访问同类中的普通成员方法;同理,在静态方法中,也无法访问同类中的非静态成员属性。即静态方法中不能直接访问非静态成员,只能直接调用静态成员(静态成员包括属性和方法);
在静态方法中不能出现this关键字;可以这样理解非静态成员是在有具体对象后,才会有的东西,所以不能访问;不具体实例化对象,而直接使用this,有点预支、预定的意思,实际对象还没有,当然也是不可以的,
如果,非得在静态方法中访问非静态成员应该这样办:
即:静态方法中不能直接访问同一个类中的非静态成员,只能直接调用同一个类中的静态成员;只能通过对象实例化后,采用“对象.成员方法”的方式访问非静态成员。。。(即,得真正有了对象之后,这些非静态成员才会依附于对象,而真正存在,此时,已经存在的静态方法才能去访问这些已经真正存在的非静态成员)
3.static-静态代码块
构造代码块
1)构造代码块在创建对象时调用,其是先于构造方法执行的;
2)在一个类中可以有多个构造代码块,对于不同的构造代码块,先出现的先执行;
当在构造代码块前加static关键字之后,构造代码块就会变成 静态代码块:
静态代码块:在类加载时调用,其优先于构造代码块执行。同一类可以有多个静态代码块,对于不同的静态代码块,先出现的额先执行;
即执行顺序是:静态代码块 > 构造代码块 > 构造方法 > 普通代码块
注:(1)无论实例化几个对象, 静态代码块只执行一次 ,构造代码块会执行多次;
注(2):在非静态代码块,可以给普通成员属性和静态成员属性赋值;在静态代码块中,只能给静态成员属性赋值,不能直接给普通成员属性赋值;
解决办法:
注(3):静态代码块的使用场景,需要在开发过程中逐渐摸索提升。。。(普通代码块。。。)
注(4):不能在静态代码块中声明静态成员,可以声明非静态成员(因为静态成员应该直属于类,处在类的“根目录”~~~);静态代码块中声明的成员,在外部无法访问
4.代码块中的变量应用
下面两个报错的情况,可以看下报错的情况,以了解变量的作用范围。不能出现重复变量
5.总结
(1)主要是,可以在构造方法中通过调用set方法初始化对象;
(2)static成员是直属于类的,类加载时就可用了;但非static的东西是与对象相生相伴的,没有实际对象时,是不能使用访问的,(this代表当前对象,也是同理,没有实际对象时,不能在涉及static的地方瞎用);
(3)静态代码块和构造代码块在初始化类和初始化对象时的作用;(在开发中多留意这种用法的使用场景)
(4)多想想为什么会有static这种东西;
(5)多想想,关于封装的private、get、set、包、static、代码块这些的作用,理解其在程序设计中,所谓封装的含义。