访问控制
常见的访问控制
public - 公开的
protected - 保护的
默认方式 - 默认的
private - 私有的
访问控制符的比较
访问控制符 访问权限 本类 本包中的其他类 子类 其他包中的其他类
----------------------------------------------------------------------------
public 公开的 1 1 1 1
protected 保护的 1 1 1
默认方式 默认的 1 1
private 私有的 1
a.通常情况下,所以的成员变量都用private修饰,所有的成员方法都用public修饰。
b.public修饰的内容表示可以在任意位置进行访问;
c.private修饰的内容只能在本类的内部进行访问。
包的定义
package 包名; - 表示创建单层包
package 包名1.包名2.....包名n - 表示创建多层包,也就是多层目录;
为了管理文件方便,避免文件同名引起的冲突。
封装
基本概念
通常情况下在测试类中可以给成员变量赋值一些合法但不合理的数值,
而程序的执行过程无法检测和提示,和我们的现实有点不太符合。
为了避免上述情况的发生,就需要对成员变量的赋值操作进行合理性的判断和提示,
该方式就叫做封装,通俗的来说,封装就是一种保证我们成员变量值合理的机制。
封装的流程
(1)私有化成员变量,使用private关键字修饰;
(2)提供共有的get成员变量和set成员变量的方法,在方法体中进行合理的判断。
(3)在构造方法体中调用set成员变量进行合理值得判断
static 关键字
基本概念
- 通过情况下成员变量都隶属于对象层级,每个对象都拥有独立的内存空间来记录自己独有的成员变量,当所有的对象的成员变量值都完全一样的时候,若每个对象单独记录则会造成内存空间的浪费,此时,应该将该成员变量由对象层级提升到类层级,在内存空间中只保留一份而且被所有的对象所共享,为了实现该效果使用static关键字来进行修饰,表示静态的含义。
- static关键字可以修饰成员变量和成员方法表示隶属于类层级,推荐使用类名.的方式访问
使用方式
- 对于非静态的成员方法来说,既可以访问非静态的成员同时也可以访问静态的成员;(成员:成员变量+成员方法)
- 对于静态的成员方法来说,只能访问静态的成员不能访问非静态的成员;
(执行静态方法时候可以还没有创建对象,非静态成员隶属于对象层级) - 只有被所有对象共享的内容才能加static。static不能随便加。
继承
基本概念
- 当多个类之间有相同的特征和行为的时候,就可以将相同的内容提取出来组成一个新类,让原来的这些继承自新类就可以了,从而实现原来的这些类吸收新类中的成员的效果,此时在原来这些类中只需要编写自己独有的成员即可。
- 换一句话来说,继承就是一种用于提高代码复用性、可维护性以及可扩展性的机制。
在Java语言中使用extends关键字来代表继承的关系。
比如:
class Student extends Person{ } --- 表示Student类继承自Person
其中Person 类叫做超类/父类/基类
其中Student类叫做 子类/孩子类/派生类
注意事项
1.子类可以继承父类中的成员变量,包括私有的成员变量,但不能直接访问;
子类不可以继承父类中的构造方法以及私有的成员方法。
2.构造子类对象时候会自动调用父类中的无参构造方法,用于初始化从父类中继承下来的
成员变量信息,相当于在子类构造方法中的第一行增加代码:super();
3.在java语言中只支持单继承,也就是一个子类只能有一个父类,但一个父类可以有多个子类;
4.只有满足:子类 is a 父类 的逻辑关系才能用继承,不能滥用继承(student is a people)
super关键字和this关键字的比较
基本概述
- this关键字代表本类的对象
- super关键字代表父类的对象
使用方式
使用this.方式可以访问本来的成员变量和成员方法
使用super.方式可以访问父类的成员变量和成员方法
使用this()的方式在构造方法的第一行表示调用本类的构造方法。
使用super()的方式在构造方法的第一行表示调用父类的构造方法。
class Person{
private int age;
public void setAge(int age){
this.age = age;
}
}
1.使用this.的方式可以区分同名的形参变量和成员变量。
2.使用super(实参)的方式在构造方法的第一行可以调用父类的构造方法。
3.使用super.的方式可以调用父类中被重写的方法。
方法的重写
- 当父类中继承下来的方法不足以满足子类需求的时候,则需要在子类中重写一个与父类一模一样的(方法名相同、参数列表相同、返回值类型相同)的方法,叫做方法的重写/覆盖。
方法重写的原则:
- 相同的方法名称,相同的参数列表,相同的返回值类型或者返回子类。
- 访问权限不能变小,可以变大。
- 不能抛出更大的异常。
在子类重写的方法中,可以通过super关键字调用父类的“原始”方法。