1.包、软件包(含控制访问修饰符表)
包(package)的本质就是不同的文件夹
包的作用:
可在不同包,放相同的类
更好的管理类
控制访问范围
包的命名规则
- 只能由字母、下划线、小圆点构成
- 数字不开头
- 不可使用保留字、关键字命名
包的导入
导入包用Import,尽量用到哪个函数就导入哪个类,而不是导入全部包。
package 后面接类当前所在的包,而且必须放在类的最上面,只有一句
import在类定义之前就行,可以有多句
后面四种关系是看该变量是在哪个类里定义的,与其本身变量所处类无关。
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 |
---|---|---|---|---|---|
公开 | public | √ | √ | √ | √ |
保护 | protected | √ | √ | √ | × |
默认 | 无 | √ | √ | × | × |
私有 | private | √ | × | × | × |
2.封装
作用:隐藏实现细节、对数据进行验证、代码复用
封装实现步骤
- 将属性私有化private
- 提供公共方法public,的set,或get(在别的类定义的该类变量无法访问privarte属性,但是可以访问该类的public类型的函数,而该类的类型函数是属于他自己类里的,所以虽然不能通过变量.属性方法直接访问、修改对应属性,但是可以通过访问public类型的函数简介修改、访问私有属性)
package fengzhuang;
public class Account
{
private String name;
private String pasw;
private double salary;
public Account(String name,String pasw,double salary) //构造函数赋初值
{
setName(name);
setPasw(pasw);
setSalary(salary);
disp();
}
public void setName(String name) //public函数访问私有属性
{
if(name.length() >= 2 && name.length() <= 4)
this.name = name;
else
{
System.out.println("输入长度有误(2~4位字符):设置默认值为张三");
this.name = "张三";
}
}
public void setPasw(String pasw) //public函数访问私有属性
{
if(pasw.length() == 6)
this.pasw = pasw;
else
{
System.out.println("密码位数错误(6位),默认值设为123456");
this.pasw = "123456";
}
}
public void setSalary(double salary) //public函数访问私有属性
{
if(salary >= 20)
this.salary = salary;
else
{
System.out.println("金额太少(至少为20),设置默认值为20");
this.salary = 20;
}
}
public void disp() //public函数访问私有属性
{
System.out.println("用户信息为:\n姓名 : " + this.name + "\n密码 : " +
this.pasw + "\n余额 : " + salary);
}
}
3.继承
定义方法:class + 子类 + extends + 父类名
父类一般定义的是子类的共有属性、方法
注意细节:
- 子类继承了父类所有的属性和方法,但是子类不可直接访问父类的私有成员,必须通过public方法访问
- 在调用子类的构造函数时,首先要调用父类的构造函数,没有构造父类,那么子类也无法构造,有先后顺序
- 调用子类构造函数时,无论子类调用有参构造函数还是无参构造函数,都会默认调用父类的无参构造函数super()。
- 如果父类没有无参构造函数,那么必须在子类写明super(参数),调用父类有参构造函数。因为父类自定义构造函数时,默认的构造函数会被覆盖
- super使用时必须放在构造函数的第一行
- super和this都是只能放在构造函数第一行,因此两者不可同时出现在同一构造函数内
- object类是所有类的父类,一般是默认隐藏(ctrl + h显示继承关系)
- 父类构造函数调用并不只限于直接父类,若父类没有该属性和函数,将跳过父类再向上依次寻找,但是若父类有该属性但是是private,则直接报错,停止查找
- 子类只能继承一个父类
- 构造时是先父后子(子构造第一行默认调用无参父构造),调用同名方法、属性时则是就近原则,先子后父
4 super
super是当前子类的父类(不仅仅是直接父类)的类引用
继承访问步骤:
-
子类调用函数时,直接使用cal()等价于this.call()。都是从当前子类开始寻找,若子类有相应方法则直接调用子类方法不再向上查找
-
子类调用函数时,若子类没有该方法,则一直向其父类逐个查找,知道找到相应方法,或者到object类,返回查找失败。
-
子类调用函数时,若父类有该方法,但是子类无权访问。即private父类方法,则会报错,停止查找。
-
super.call()是从子类的父类开始向上查找,子类有此方法也不调用
5 重写/覆盖
使用细则:
- 子类的函数的参数、函数名称与父类完全一样
- 父类的返回类型与子类一样或者包含子类
- 父类访问权限应该小于等于子类的访问权限(public > protected >默认 > private)
6重载与重写的比较
名称 | 作用范围 | 函数名称 | 参数列表 | 返回类型 | 修饰符 |
---|---|---|---|---|---|
重载 | 一个类之中 | 一样 | 类型、个数、顺序至少有一个不同 | 无要求 | 无要求 |
重写 | 父类与子类之间 | 一样 | 一样 | 父类返回类型等于或包含子类 | 父类访问权限不大于子类 |