面向对象
- 一种抽象的编程模型
将复杂问题分解成一个一个独立小问题,
通过一个一个解决这些小问题,
来解决大问题类
对象(实例)
引用
构造方法
this
方法重载继承
super
多态
instanceof抽象类
final
static
接口内部类
类
- 可以理解成 “图纸”
是对事物、逻辑、算法、概念的抽象
将相关的数据、方法,进行封装,
封装成一个独立的程序组件
对象(实例)
- 可以理解成:从图纸生产出的产品
从类创建出的具体实例
每个对象都是独立的,
- 每个对象新建时,都会分配新的内存空间,
来保存各自的属性变量值
引用
- 可以理解成: 遥控器
- 引用变量,保存一个对象的内存地址
使用引用变量,
可以找到内存中的一个对象,
访问对象的属性值,
或控制这个对象来执行指定的方法引用变量的特殊值: null(空)
构造方法
在新建实例时,执行的一个特殊方法
new Soldier(); new Soldier(9527); new Light(); new Light(Color.WHITE);
作用:
*) 不知道
*) 构造方法中可以自己编写任何代码
*) 常见写法:初始化成员变量一个类必须有构造方法
不定义构造方法,编译器会添加默认构造方法
public class A { //public A() { //} }
允许定义不同参数的多个构造方法
public class A { public A() { } public A(int i) { } public A(int i, String s) { } }
练习图例:
this
用来引用成员
this.name *) this表示当前对象, 用哪个对象调用,哪个对象就是当前对象 *) 本质是一个特殊引用, 保存当前对象的内存地址
构造方法之间调用
this(...) *) 目的: 减少代码重复 *) 一般从参数少的构造方法,调用参数多的构造方法 参数的处理,集中在参数最多的构造方法中, 其他构造方法,调用这个构造方法的代码 *) 构造方法之间调用,必须是首行代码
方法重载
- 同名不同参
继承
- 作用: 代码重用、代码复用
- 子类继承父类
单继承
*) 一个类,只能继承一个父类
*) 一个父类,可以有多个子类继承了:
*) 可见的成员不继承:
*) 不可见的成员
*) 构造方法
*) 静态方法创建子类对象
Student s = new Student();1) 新建父类对象,执行父类构造方法 2) 新建子类对象,执行子类构造方法 *) 两个对象绑定在一起, 作为一个子类对象
创建子类对象,构造方法执行过程
Student s = new Student();1) 先执行父类构造方法 *) 默认执行无参构造 super();//隐含代码 *) 也可以手动调用父类构造方法 在子类构造方法中添加: super(参数...); 2) 再执行子类构造方法 *) 如果父类没有无参构造方法, 必须手动调用父类有参构造方法 *) 手动调用父类构造方法, 根据需要,可以选择任意的构造方法来调用
通过子类对象,调用成员
s.xxx
s.xxx()1) 先在子类对象中查找这个成员
2) 再在父类对象中查找这个成员*) 子类有,执行子类的;
子类没有,执行父类的。方法重写 Override
*) 从父类继承的方法,不满足子类需要
可以在子类中重新编写这个方法
*) 可以用 super.xxx(),调用父类中的同一个方法*) 方法签名(方法名、参数列表)必须与父类一致
*) 返回类型允许使用更小的类型
*) 访问范围不能降低
*) 抛出的异常不能更多super
重写方法时,调用父类同一个方法
public String toString() {
…
super.toString()
…
}手动调用父类构造方法
super(); //默认
super(参数…); //手动调用*) 必须是首行代码
练习图例:
多态
作用: 一致的类型
类型转换
*) 向上转型
子类对象转为父类型*) 转型之后,只能调用父类中定义的通用成员
*) 向下转型
已经转为父类型的子类对象,
再转回成子类型instanceof
运行期类型识别
对真实类型及其父类型判断,都得到 trueShape s = new Line();
s instanceof Line true
s instanceof Shape true
练习图例:
抽象类
作用:
*) 通用代码
*) 通用方法定义抽象类不能创建对象
有抽象方法的类,必须是抽象类
- 抽象类中,不一定有抽象方法
final
可以修饰类、方法、变量
变量
变量的值不可变,称为“常量”
final int a = 10;
a = 11; //错,a变量不能被重新赋值
final Point a = new Point(3,7);
a.x = 30;//对,被引用的对象的属性可变
a = new Point(6,5);//错,a变量不能被重新赋值方法
不能被子类重写
类
没有子类
static
- 静态
静态成员属于类,而不属于对象
静态成员应该用类名来调用(避免被误解)
静态方法中,不能调用非静态成员
什么时候使用 static?
*) 使用原则:能不用就不用 静态是“非面向对象”语法 *) 使用场景: *) 共享的数据 *) 常量 static final PI = 3.14; Integer.MAX_VALUE *) 工具方法 Integer.parseInt() String.valueOf() Math.sqrt()
练习图例:、
练习图例2: