封装
封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
从上面就可以知道为什么要使用封装了。相对于其他类型的数据,可以被直接操作成员属性,这样会出现不安全的情况。
因此出现了先的关键字:private 私有的 --> 成员修饰符
那么私有的就一定保证安全么?属性不允许直接操作
间接操作在方法中可以进行逻辑判断
因此在后面的java学习中,我们尽量多使用私有属性,然后通过提供公共的访问方式来改变数据,而不是向之前直接可以修改数据,这样做大大提高了安全性。
封装的优点:
提高代码的安全性
提高代码的复用性
举例:
public String name;
private int age;
public String gender;
在上面的三个定义中,private定义的数值不可以被直接修改,而public可以。
想要对私有类型private进行修改,需要 设置器 和 访问器 在该类中来修改private修饰的值。
age的设置器
返回值:不需要 参数:需要
public void setAge(int age){
if(age>0 && age<=150){
this.age = age;
}else{
System.out.println("年龄不合法!!!");
}
}
age的访问器
返回值:需要 返回值int age参数:不想要
public int getAge(){
return age;
}
继承
继承: 子承父业 extends(继承+扩展)
类: 一系列对象的共性-->对对象的抽象
父类: 一些列类的共性 -->对类的抽象
简单的说明一下为什么要使用继承,很大程度上是为了简化代码,比方说:班级里面有一群学生和老师,他们共同的属性是:性别 年龄 姓名。 如果定义一个学生这些值写一遍,定义一个写一遍,那么效率太低了。因此把他们共同属性用一个父类来存储,而下面各种各样的子类,只要继承了这个父类,那么父类中的这些属性子类就可以读取到了,并且还可以扩展性的属性,比如学生可以加 public String suject; 老师就可以加别的属性 public String teach ;
为什么要用继承:
提高代码的复用性
如何使用继承:
子类 extends 父类
继承的好处:
1)提高代码的复用性
2)子类一旦继承父类,就可以使用父类中的内容
3)子类中定义自己多有的内容
一类父类可以被多个子类继承,但是一个子类只能继承一个父类,java是单继承机制,但是可以多实现
能够修饰类的修饰符: public | default (默认)
单继承的优点:
使用简单
单继承的缺点:
不便于后期维护
面向对象的设计原则之一: 开闭原则,对修改关闭,对扩展开放
举例:
父类 人Person
class Person{
public String name;
public int age;
public String gender;
//休息
public void sleep(){
System.out.println(name+"正在休息...");
}
}
子类 学生继承父类 Person
class Student extends Person{
public String subject; //新增-->扩展
public Student() {
// TODO Auto-generated constructor stub
}
//学习
public void study(){
System.out.println(name+"正在敲代码...");
}
}
权限修改符
权限修饰符 :访问对象成员的限定范围
就像前面说的private就是,限制了对象成员的范围,只有同一个类中可以访问。
private本类
default(默认)本类 同包类
protected 本类 同包类 不同包子类
public 本类 同包类 不同包子类 不同包
成员修饰符,只能修饰成员,不能修饰局部
修饰类的权限修饰符:public ,default(默认的)
私有内容不能被继承,静态的可以被继承
使用protected修饰的内容:
1.同包类
2.不同包的子类中,通过继承关系使用
重写
重写 和 重载的区别:
都是指方法才有重写和重载
重载:
1.同一个类中
2.多个方法方法名相同
3.参数列表不同|方法签名(方法名+参数列表:区分方法的唯一)
重写的条件:
1.不同的类
2.继承|实现
3.方法签名相同
作用: 子类一旦重写父类中的某个方法,子类对象调用的是子类中重写的方法,对父类同名方法屏蔽
检查是否为重写方法:
1.左侧出现向上的三角形
2.注解 Override @注解名
不能被重写:
1.private修饰的方法不能被重写
2.final修饰的内容不能被重写
3.被static修饰的内容不能被重写
如果子类中定义一个方法,在它的父类中有同名(方法签名)的静态方法,子类中的这个方法也必须是静态的。
重写的要求:
== : 方法签名必须完全相等
<= : 返回值类型 : 基本数据类型必须相等, 引用数据类型:子类的返回值类型<=父类的返回值类型
>= : 子类重写方法的的权限修饰符必须>=父类中这个方法的权限修饰符
举例:
//父
class JianLin{
private String xiaomi;
//名言
public JianLin words(){
System.out.println("先定一个小目标,挣他一个亿...");
return null;
}
void haha(){
}
}
//子类
class SiCong extends JianLin{
//父类中的方法我要,方法的实现不满足我要求,子类中对这个方法进行重写,重新定义方法体的实现
@Override
public SiCong words(){
System.out.println("我不在乎我的朋友有钱没钱,反正都没我有钱...");
return null;
}
//子类新增方法
public void play(){
}
void haha(){
}
void haha(int a){
}
}
Super
super 和 this 之间的区别:
this:指代当前new的对象
super: 指代父类对象
调用父类构造器: 在子类构造器首行调用父类中的某个构造器
super(参数列表);
如果没有显示调用,默认在 首行 调用父类空构造,如果一旦显示调用,就不会默认调用父类空构造器了
为什么要显示调用父类的其他构造器:
1.父类没有空构造
2.简化代码
首行调用构造器:super和this不能同时存在,因为都要在首行
如果存在this(),会在this调用的构造器首行调用父类构造器
区分同名变量问题:
父类中的成员和子类中的成员同名问题:
默认this指代子类(就近原则),如果想要使用父类中的同名成员,super调用
如果使用:先找局部-->本类中的成员(this)-->父类中(super) ,默认就近原则
创建对象: 先父类后子类
初始化: 先静态后成员
Final
final :最终的
final修饰的变量为常量
final修饰的方法不能被重写
final修饰的类不能被继承(太监类)