第六章
第六章 面向对象基本特征
6.1 封装
- 隐藏实现细节, 方便使用者使用
- 安全, 可以控制可见范围
修饰符 | 当前类 | 同一包内 | 其他包子类 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
public class Student {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
6.2 构造
实例化类就会执行构造器
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name, int age){
this.name = name;
this.age = age;
}
}
6.3 this
当前对象
用法
-
this.属性
public class Student{ private int score; public void setScore(int score) { this.score = score; } }
-
this.方法
同直接调用方法 -
this()
public class Student{ private int score; public Student() { } public Student(int score) { this(); this.score = score; } }
6.4 包
- 避免重名
- 分类组织管理众多的类(java.lang, java.util, java,io)
- 控制可见范围
语法格式
package 包名;
必须在源文件代码首行
一个源文件只能有一个包
命名规范
- 所有单词都小写每个单词用 . 分割
- 公司域名倒置(com.baidu.xxx)
使用其他包的类
-
使用类型的全名称
java.uitl.Scanner input = new java.uitl.Scanner(System.in);
-
使用import
import 包.类名;
6.5 继承
代码复用
代码扩展
语法
[修饰符] class 类名 extends 父类 {
}
特点
- 子类会继承父类所有非私有属性, 方法
- 不会继承构造器但是会调用父类构造器
- java只支持单继承
- java可以多层继承, 会代代相传
6.6 重写 Override
父类的方法对子类不合适可以这么做
- 方法名, 形参列表必须相同
- 权限修饰符必须 >= 父类
- 返回值
基本数据类型和void必须相同
引用数据类型必须 <= 父类
重载(Overload)和重写(Override)的区别
重载(Overload)在一个同类中, 方法名相同, 形参列表不同,和返回值类型无关的两个或多个方法
特殊的重载
public class TestOverload {
public static void main(String[] args) {
B b = new B();
b.a();
b.a(null);
//b有.a()和.a(str)方法,算是重载
}
}
class A{
public void a(){
}
}
class B extends A {
public void a(String str){
}
}
6.7 关键字 super
引用父类
- super.属性
重写父类属性后可以这样调用父类属性 - super.方法
重写父类方法后可以这样调用父类方法 - super(), super(参数列表)
调用父类构造器
必须在构造器首行
子类没写默认也调用父类构造器
6.8 非静态代码块'
public class temp {
{
非静态代码块
}
}
- 在创建对象时, 为对象赋值, 协助完成实例初始化
- 每次创建对象都会执行
- 优于构造器执行
6.9 实例初始化过程
- 实例初始化过程: 实例创建的过程
- 实例初始化方法: 实例对象创建时要执行的方法
- 实例初始化方法由编译器编译生成
- 实例初始化方法的形式: <init>() 或 <init>(形参列表)
- 实例初始化方法的构成
- 属性的显式赋值代码
- 非静态代码块的代码
- 构造器的代码
属性的显式赋值代码和非静态代码块的代码按上下顺序执行
构造器的代码最后执行
一个类有几个构造器, 就有几个实例初始化方法
父子类的实例初始化
- super() 和 super(实参列表) 调用了父类实例化方法
- super() 和 super(实参列表) 必须在子类实例化初始方法的首行
先执行父类的实例初始化方法, 在执行子类的实例初始化方法
6.10 多态
父类 标识符 = 子类;
- 编译时看左边父类, 运行时看右边子类
上转型
自动转换
下转型
强制类型转换
//必须保证这个对象是子类或者子类的子类( >= 强转的类型)
(子类)标识符;
instanceof
//返回 true 或 false, 返回true说明可以强转右边
对象/变量 instanceof 类型