封装和继承
private - 私有化
含义:私有化
作用:
- 修饰属性:私有化属性,不能让外界访问
- 修饰方法:私有化方法,不能让外界使用
应用场景:只能在本类中才能访问,不让外界访问的属性和方法,就用private修饰
封装
步骤:
- 私有化属性
- 添加 get (获取) / set (设置) 方法
好处:外界不能直接操作属性,必须通过get、set方法操作,提高代码的安全性,可以在get、set方法中添加其他的功能
this
含义:代表本对象。出现在方法中,表示调用该方法的对象
作用:
- this.属性:调用本对象的成员变量
- this.方法:调用本对象的成员方法
- this():调用本对象的构造方法(在一个构造方法中的第一句调用另外一个构造方法)
分包
基本作用:解决了类重名的问题
项目作用:项目中有许多的类,把功能相同的类放在同一个包中,方便管理
工具类:com.dream.util/tool
实体类:com.dream.vo/bean/entity
数据库类:com.dream.dao/mapper
static 关键字
作用
类加载到方法区时,JVM会扫描该类的所有属性,并把静态属性加载到静态区中,静态属性属于类属性,该类所有的对象都共享该属性,静态属性直到项目结束时才会被回收
注意:静态属性使用类名调用
-
修饰方法
属于类方法,直接用类名调用
应用场景:工具类
-
静态代码块
- 静态代码块是类加载到方法区时才会被调用,将类中的静态变量加载到静态区,该代码块只能初始化静态变量。
- 代码块是创建对象时优先于构造方法调用,该代码块可以初始化成员变量和静态变量。
- 构造方法是创建对象时调用,该方法可以初始化成员变量和静态变量
成员变量 vs 静态变量
成员变量:属于对象的变量,每个对象独享一份
静态变量:属于类的变量,所有对象都共享一份
静态方法
含义:静态方法属于类的方法,直接用类名调用
应用场景:工具类
静态代码块:类加载到方法区时调用
可以初始化静态变量
public class A { String str1; static String str2; static{ str2 = "yyy";//A.str2 System.out.println("A的静态代码块"); } }
代码块:创建对象时优先于构造方法调用
可以初始化静态变量、成员变量
{ str1 = "xxx";//this.str1 str2 = "yyy";//A.str2 System.out.println("A的代码块"); }
构造方法:创建对象时调用
可以初始化静态变量、成员变量
public A() { str1 = "xxx";//this.str1 str2 = "yyy";//A.str2 System.out.println("A的构造方法"); }
继承
概念:子类继承父类的属性和方法
好处:减少代码冗余
应用场景:多个类中,有相同的属性和方法,就抽取出来放在父类中
深入理解继承
1.创建子类对象,会调用父类构造方法吗?
会
2.创建子类对象,先调用父类构造方法还是先调用子类构造方法?
先调用子类构造方法
3.创建子类对象,先完成父类构造方法还是先完成子类构造方法?
先完成父类构造方法
4.创建子类对象,会创建父类对象吗?
不会
5.创建子类对象,调用父类构造方法的目的是什么?
目的是在子类对象中开辟空间用于存放父类的属性
6.子类可以继承父类的私有化属性和方法吗?
可以继承,但是不可以直接调用,但可以在父类中设置公有的方法,在公有的方法中调用私有的属性和方法,即间接调用。
public static void main(String[] args) {
B b = new B();
b.aMethod02();
}
public class A {
String aAtrr;
//父类私有化属性
private String a = "xxx";
public A() {
System.out.println("父类的构造方法");
}
//父类私有化方法
private void aMethod01(){
System.out.println("父类私有化方法");
}
public void aMethod02(){
System.out.println(a);
aMethod01();
}
}
public class B extends A{
String bAtrr;
public B() {
//super();//调用父类无参构造,默认实现
System.out.println("子类的构造方法");
}
}
super 关键字
super: 代表父类
作用在子类中:
1.super.成员变量:调用父类的非私有化成员变量
2.super.成员方法:调用父类的非私有化成员方法
3.super():调用父类的非私有化构造方法
注意:在子类的构造方法中必须是第一句就调用父类的构造方法public class A { String str; public A() { } public void aMethod(){ System.out.println("A类的方法"); } } public class B extends A{ public B() { //调用父类的非私有化构造方法 super(); } public void method(){ //调用父类的非私有化属性 super.str = "xxx"; //调用父类的非私有化方法 super.aMethod(); } }
方法重写(复写)
应用场景:父类的方法不满足子类需求时,可在子类中重写
条件:
1.方法重写的位置在子类中
2.重写方法的 返回值、方法名、参数列表都必须和父类的方法一致
3.访问修饰符不能比父类更严格
//@Override - 注解:既解释给程序员也解释给程序,告诉程序这个方法是重写父类的方法 @Override public void eat() { System.out.println(super.getName() + "正在吃午饭..."); }
访问修饰符
含义:修饰属性、方法,用于定义变量的使用范围
使用权限高—>低 (private–>public)
访问修饰符 本类 本包 其他包的子类 其他包 private OK 默认的(default) OK OK protected OK OK OK public OK OK OK OK