声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.
封装: 强调保护与易用
什么是封装: 对外屏蔽类内部一些实现细节,类的外部只能通过类提供的方法来操作类;
封装: 将数据和操作数据的方法进行结合,隐藏对象的属性和实现细节,对外部提供公开的方法进行交互;
如何实现封装: 通过类结构以及访问修饰符来实现封装性;
四大访问修饰符,可见性依次从小到大为
private(私有权限,类内部可见) < default(包访问权限,包内部可见,同级包中可见) < protected(继承权限) < public(公开的,整个项目可见)
权限修饰符指的是在哪些"类"的内部可见,与具体的对象无关;
private访问修饰符
- private修饰属性,称为私有属性,这些属性只在当前类的内部可见;
使用private关键字对属性进行封装操作; - 当属性被private封装后,类中需要提供getter和setter方法来控制私有属性被外部的访问,类的外部通过getter/setter方法来使用私有属性;
getter => 取得私有属性
setter => 修改私有属性
到底哪些属性有getter,哪些属性有setter,根据属性的具体情况来定,需要外部访问的加上getter,需要在外部进行修改的,加上setter; - 使用private对属性进行封装,就可以在类的外部限制属性的使用; 必须按照类提供的getter和setter,按照一定的规则去操作属性;
- private修饰方法可以在当前类的内部使用,供类内部的其他方法进行调用,对外部隐藏;
- private不能直接修饰外部类(直接定义在源文件中),private可以修饰内部类(私有内部类,这个类只供外部类使用);
default包访问权限
这个关键字不需要自己手动去写,是默认的; 什么权限修饰符都不写,就是包权限 => 在当前包的内部可见;
- 什么是包: 就是文件夹;
操作系统在一个文件夹下不能存在同名文件(文件名称 + 文件类型),不同文件夹可以存在同名文件; 名称相同,类型不同,不是重名文件; - Java中使用关键字package声明一个包,就是文件夹,解决类名称重复的问题;
- 项目中包的命名: 全小写,多个单词之间用_分隔;
Java中使用package关键字产生的包,就对应操作系统的文件夹;
不同的包下可以存在相同名称的类; - 当频繁使用一个包下的若干类,使用通配符导入:
import java.util.*; //这个只是一个简化写法,编译器会自动根据使用的类将通配符转化为具体的导入类操作;
如果要导入Date类,同时使用了java.util.*和java.sql.*都是通配符,都有Date类,编译器就不知道到底选择的是哪个Date,对Date的引用不明确; 所以推荐显示导入要使用的类名,明确导入某个具体的Date类; - 包访问权限的可见性,当访问修饰符为包访问权限时:
被修饰的对象只在当前包的内部可见,只有当前包内部的同级目录下的类之间可见,**子包(子文件夹)**都不可见;
protected继承权限
不同包的具有父子关系的类之间可见,在同一个包的毫无关系的不同类之间也可见,default有的权限,protected一定具备;
public访问修饰符:
当访问修饰符使用public,在当前项目中,任何地方都可以调用,public权限的域(类,属性,方法都可以);
开发中常用的JDK的包
- java.lang: 系统的基础开发包,String,Object,在JDK1.1后自动导入,无需显示使用import导入java.lang包;
- java.util: java提供工具程序包; 整个集合框架都在这个包下,ArrayList,Arrays都在这个包下;
- java.sql: 数据库开发包,JDBC相关的类都在这个包下,通过Java和数据库进行交互;
- java.io: IO编程开发包,文件输入输出都在这个包下;
- java.net: 网络编程开发包,Socket相关的类都在这个包下;
- java.lang.reflect: java的反射开发包,所有框架的基础都在于反射;
import关键字
- 若多个包下都存在同名的类,就要使用import导入某个包下的某个类;
类的全名称: 包名.类名
JDK中有两个常用的Date类: java.util.Date; java.sql.Date; - 要使用util包下的Date类的话,需要导入该类: import java.util.Date;
相当于操作系统中定位一个文件,文件全路径: 文件绝对路径 + 文件名称
操作系统就是根据文件的全名称来唯一定位一个文件; - 静态导入: import static
就是将一个类的所有静态域导入到当前类中,你使用别人写好的静态方法或属性,就好像是在你当前类中定义的一样;
能导入的都是public域,在当前源文件的内部都可以直接拿来用,不需要加类名称前缀;
final: 终结器-到此为止
- final修饰的属性,称为常量,一旦被final修饰的变量成为常量,一旦初始化(赋值)后,值不能改!
final修饰基本数据类型: final修饰的属性必须赋值后使用 => 具体使用之前必须赋值,一旦赋值,就无法修改; final修饰的变量数值不能改,对于基本类型来说,就是具体的数值;
final修饰引用数据类型: final修饰的变量数值不能改,对于引用类型来说,不可变的是引用类型的数值(也就是引用类型指向的地址)! 与对象内部的内容无关; - final修饰方法 => 被final修饰的方法无法被重写/覆写(override)
- final修饰类 => 被final修饰的类不能有子类
JDK中的String类就是final类;
拓展:
- 在静态方法中无法调用成员域(包括this);
- 静态变量或方法通过类直接调用(标准),通过this也能调用;
- 在静态上下文中没法使用this关键字;
- 碰到读程序的问题,统一从入口处开始看代码: main;