前言:因为有了封装,才有了继承!因为有了继承,才有了多态!
封装、继承
一:数据类型的默认值
- 基本数据类型的默认值:
byte : 0 、short:0 、int :0 、long : 0L 、 char : \0 、double:0.0 、 boolean: false; - 引用数据类型:
String :null 对象: null;
二:包
- 包的作用是区分同名类
- 包的命名规范是:所在公司域名的反写格式 + 项目名 + 组名 + 模块名,一般都是小写格式
- 包必须放在一个类的第一句,注释文本除外。
- 包的引入:使用package关键字
package com.zelin.test;
import com.zelin.pojo.Person;
import java.util.Scanner;
public class TestPack {
}
三:import关键字引入包中的类
- import关键字作用是引入一个包中的类。
- 格式:import + 完整的包名 + 类名。
- 如果需要引入一个包中多个类,那么可以使用import + 完整的包名 + *格式引入所有当前正在使用得类。这个方法不会增加正在编译的文件的大小,也不会影响程序的运行速度,但是会影响编译的速度
import com.zelin.pojo.Person;
import java.util.Scanner;
import java.util.*;
四:三大特性之-----封装
- 封装的概念:其实就是为了隐藏类中具体的实现细节,将方法或者属性设置为private私有化,并对外界提供公共的访问的方法。这样我们就保证了类中具体结构的安全,暴露简单的方法
public class Packaging {
private int age;
private String name;
private String sex;
}
- 封装后类的属性和方法一般会对外提供setter和getter方法,方便外界访问封装后的属性和方法,setter是写入方法,getter是读出方法。没有规定必须都要定义定义完全这两个方法
public int getAge() {
return age;
}
public void setAge(int age) {
//我们对此age字段进行了封装,那么创建对象是,调用构造方法赋值,
//如果不调用此字段的封装判断,那么将无意义,直接将变量赋值给成员变量
if(age <0 && age > 120){
System.out.println("老妖怪");
}else
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
- 当我们对字段进行了封装,即对setter方法进行了判断的封装后,我们需要在构造方法中使用对应的set方法进行赋值才能调用到这个封装后的字段,此时的字段才是有效的
public Packaging(int age, String name, String sex) {
// this.age = age;
//需要在构造函数中对对应的set方法赋值
this.setAge(age);
this.name = name;
this.sex = sex;
}
public void setAge(int age) {
//我们对此age字段进行了封装,那么创建对象是,调用构造方法赋值,如果不调用此字段的封装判断,那么将无意义,直接将变量赋值给成员变量
if(age <0 && age > 120){
System.out.println("老妖怪");
}else
this.age = age;
}
五:访问权限修饰符
- java中共有四种访问权限修饰符:public(公有的)、protected(受保护的)、default(默认)、private(私有的)。
- public(公有的): 可以在任何地方访问,具有最高的访问权限。即:任何位置有效
- protected(受保护的):代表只能在父子类的继承关系中存在,即只要是父子类继承的关系,哪怕不在同一个包中也能使用这个修饰符修饰的属性和方法。即:父子类有效+同一个包下有效
- default(默认权限):代表只能在同一个包内有效,即:包内有效
- private(私有的):只能在本类中能够访问,即:同一个类中有效
- 权限由高到低排序:public > protected > default > private
- 我们总结了如下图解:
六:三大特性之-----继承
- 继承:就是两个类之间的一种关系。我们称之为父子类。继承的关键字是extends
- 所有的类都默认继承了Objet类,Object也称为超类。父类也叫:基类
- 在java中是单继承的,一个类只能同时继承一个父类,但是可以多实现
- 子类不能继承父类的private私有属性和方法,只能通过父类对外提供的方法setter和getter进行访问私有属性
- 子类不能继承被final修饰的类,也不能重写父类被final修饰的方法。但是子类可以继承父类final修饰的变量和方法
- 子类继承父类必须要调用父类的构造方法,一般的,如果我们不主动super调用父类的构造方法,那么JVM会隐式调用父类空参构造方法。但是如果父类没有无参构造方法,那么子类不手动调用父类有参构造方法的话就会报错
- super调用的父类构造方法必须放在第一行,不能同时调用两个父类的构造方法
- 如果子类需要调用父类被重写的方法,可以使用super.方法名来调用父类的被重写的方法
- 继承是为了提高代码的复用性
public class Teacher extends Packaging {
//1.1) 定义教师的特有属性
private double salasy;
//1.2) 构造方法
public Teacher() {
}
//1.3) 构造特有属性的构造方法
public Teacher(double salasy) {
this.salasy = salasy;
}
//1.4) 构造所有父类属性和子类属性的构造方法
public Teacher(int age, String name, String sex, double salasy) {
//super关键字:代表父类,下面代表引用对应三个属性的构造方法
//super必须放下第一行,且只能有一个,且子类继承父类就必须至少调用父类的构造方法
super(age, name, sex);
this.salasy = salasy;
}
public double getSalasy() {
return salasy;
}
public void setSalasy(double salasy) {
this.salasy = salasy;
}
}
七:super关键字
- super关键字:指父类的实例,值向的是父类的方法、属性、构造函数
- super(参数列表)指父类的构造方法,必需放在第一行。子类必需要调用父类的构造方法
- super.方法名可以在子类调用父类被重写的方法
- super关键字是两个类之间实际上的联系纽带。extends关键字只是提示作用