一 包
1.定义:包含.java代码的文件目录,是组织类的形式,是对类和接口封装机制的一种体现
2.作用:
(1)组织代码结构,把有关联的类和接口放到一起,使类得到整理,更干净整齐
(2)使当前名字得到管理(避免名字重名的引起冲突)
例如:自己写了一个Date类和别人写了一个Date类,此时放于不同的包中就不会重复定义,使用时也能识别出使用的是哪个Date类
3.包名:
(1)一般使用小写
(2)约定俗成的规则:一般使用公司域名网址的倒序形式来表示
例如:sogou.com创建包时命名:com->sogou
注:具体情况还是要与之前的人写的形式相类似
4.使用包:
注:别人写的代码也是用包的形式组织起来的,要使用别人的代码,就需要引入他们的包
(1)使用:要使用import语句引入包中的类
(2)通配符*:其加在包名后表示引入该包中的所有类
注:不建议这样写,因为不同包中的类的名字可能重复,会导致编译时有二义性,编译器无法识别你要使用的是哪个包
(3)特殊情况:java.lang这个包系统会自动导入,不需要额外import(包含String和System类)
(4)特殊的包:
java.util:java提供的工具程序包
二 封装
1.定义:把内部的细节隐藏起来
广义:广泛地指进行各种操作的时候将内部细节隐藏起来
例如:创建方法时将方法的内部细节隐藏起来,实现网络协议时把下层协议隐藏起来
狭义:单指实现类这一情况,将类内部的实现细节隐藏起来
2.作用:
(1)使使用者无需了解底层实现也能进行使用,使用的学习成本低,使用起来简单
(2)即使之后内部类的实现有所调整,使用者也无需关心
(3)对用户的操作进行限制,提供方法让其操作在合理范围内
3.实现方式:使用限定符进行修饰
(1)public:都可以进行访问操作
(2)protected:本类+同包不同类+不同包的子类
(3)default:默认权限,如果变量方法前面没有加修饰,则默认为default,权限为本类+同包不同类
(4)private:本类
注:在本类的main方法中直接访问私有属性是可以的,如果其为成员属性,则可以直接进行访问,若其为实例属性,则需要创建实例再对其进行调用(成员方法中没有现成的this引用,需要有对应实例才知道其指向的是哪一份属性)
注意:之后做修改代码题或查看别人代码时要注意检查其是否将方法和属性设置为private但却对其进行直接使用了(会导致出错)
4.使用原则
(1)一般来说属性设为private,方法设为public
注:但实际中还是要根据实际需要去使用修饰,看当前是否需要让用户对其进行操作
例如:计算机内部,对于显示器需要设为public开放出来让用户来进行操作,而对于cpu则需要设为private在内部进行操作
(2)对于private的属性,可以通过设置public的方法来对其进行设置和获得(getter和setter方法),可以进一步限制用户的行为的灵活性(注:实际操作要考虑:用户能否得到这个属性,能否设置这个属性,是否要给外部进行使用)
例如:使用一个计算机,其内部是内存硬盘cpu等在进行操作,属于private的属性,我们使用的键盘,鼠标就相当于public的方法,借助鼠标和键盘来对这些private属性进行操作
注:idea可以自动生动(使用alt+ins)
(3)注:使用后限定符仅是限制其作用域,没有改变其生命周期
三 staic关键字
1.解释由来:
C++在研发的时候希望一种属性和方法,是隶属于类的(区别于实例属性和实例方法),无论该类的实例创建多少个,此属性和方法都只会创建一份,为该类的所有实例所共有,所共用,并且无需创建实例,通过类名就可以使用的属性和方法
表示这种类属性和类方法需要用一个关键字与实例属性实例方法区别开,但由于引入一个新的关键字有大风险(可能引用的关键字与其他用户所使用标识符重名导致程序错误,以及增加了新的学习成本,兼容性差),所以C++直接复用了staic关键字,导致stati的字面意思与其在面向对象中所起到的功能并不相符
兼容性:要尽可能与前面现有的保持一致,否则可能会导致现有的顾客流失
2.作用:修饰属性和方法,使其成为类属性和类方法
注:类中的两大属性:
类属性==成员属性
实例属性
实例=
3.修饰:
(1)属性:
(i)影响:使其成为所有对象共有的属性,为类属性
注:类属性为共用的,无论创建多少个对象,其只存在一份,区别于实例属性每创建一个对象就会创建一份新的实例属性
(ii)存储位置:
类属性存储于方法区上
实例属性存放于堆区上
注:类的方法区中存储的内容:类的相关信息(类名是什么,有哪些属性,方法,这些属性被什么修饰,以及方法的一些相关信息等)+该类中的方法要执行那些指令(.java源代码编译生成的二进制字节码文件)+类中的类属性
(iii)访问方式:用过类名访问/通过实例访问
注:更推荐通过类名访问,因为通过实例访问也是通过找到其类再去进行访问的
(iv)生命周期:伴随着类的一生(在类加载时就创建,在类销毁时销毁)
区别于实例属性:实例属性的生命周期是伴随着实例的一生,new对象时其创建,对象被GC回收时也顺带被销毁
(v)初始化:在类加载时顺带初始化,并且只初始化一次
(2)方法
(i)使这个方法为所有对象所公用,为类方法
(ii)存储位置:无论是类方法还是实例方法,都存储在方法区,且为所有对象所共有
(iii)访问方式:使用类名访问/使用实例访问
注:类方法和类属性都是不用创建实例就能对其进行访问的
(iv)访问权限:前提:成员方法都是所有对象所共有的,所以成员方法中不存在this引用
而所有的实例属性和实例方法都是创建对象时创建独一份属于该对象的,在类内调用时都是隐藏的this.属性/方法,因此在成员方法中无法调用实例属性和实例方法,只能使用成员属性/调用成员方法(不带有this引用)
特殊情况:利用空引用访问类方法(√)
原因:由于类方法的访问不需要创建实例,即使利用实例访问类方法,也是通过该引用的类型找到该类再进行调用,所以当该引用指向的是null,其也可以调用类方法,此时只需要知道其类型找到对应的类,并不需要其具体指向的哪个对象(null不指向任何对象,但调用时也没有去访问其对象)
(v)重写:staic方法不能进行重写
原因:重写的目的是为了实现多态,而多态是父类引用指向子类对象调用重写方法时呈现的不同形态,而成员方法是属于类的,与对象无关,此时父类和子类只能算两者有相同名字的方法名,但是他们之间并没有实质的联系
(vi)特殊的static方法main方法:其也是通过类名.的方式来进行访问的,但无需我们手动调用,而是JVM来进行调用的
四 代码块
1.本质:由{}括起来的代码
2.分类:
(1)普通代码块
(2)构造代码块:
(i)作用:用于创建对象时初始化实例属性的
(ii)执行时机:在new对象时,且在构造方法执行之前
(iii)特点:有几个实例,就执行几次;构造代码块中存在this引用,可以用于访问实例方法和实例属性
(3)静态代码块:
(i)作用:用于初始化成员属性
(ii)写法:static{ 代码块}
(iii)执行时机:在类加载时执行,开辟空间并初始化
(iv)特点:仅在类加载的时候执行一次;没有this引用,不可在内部访问实例属性和实例方法;多个静态代码块会根据定义的顺序合并在一起执行