面向对象的三个特性
封装性
封装是指两方面:
- 把对象的属性和行为看成一个整体,将两者封装在一个不可分割的独立单位(对象)中
- 信息隐蔽,把不需要外界知道的信息隐藏起来。
封装的另一个特点是:为封装在一个整体内的变量及方法规定了不同级别的"可见性"或访问权限。此时,必须提供getter/setter方法。
继承性:extends
首先拥有反映事物一般特性的类,再在其基础上派生出反映特殊情况事物的类。
被继承的类成为父类或超类,继承产生的类称子类或者派生类。根据继承机制,子类继承了父类所有的成员,并可以增加自己的成员。
子类构造器默认调用父类无参构造器,子类构造器中第一行默认添加super();若父类没有无参构造器,可以使用super(参数列表)手动调用父类有参构造器。
拥有同一个父类的两个子类无关。
优点:继承机制大大增强了程序代码的可复用性,提高了软件的开发效率,降低了程序产生错误的可能性,也为程序修改提供了便利。
一个子类可允许继承一个父类,而Java中通过接口实现一个子类与多个父类之间的联系。
多态性
多态是指允许程序程序中出现重名现象,具体表现为两种形式:
- 方法重载:在一个类中没允许多个方法使用同一个名字,单方法参数不同,完成功能也不同
- 对象多态:子类对象可以与父类对象互相转换,而且根据使用的子类不同,完成的功能也不同
编译时类型和运行时类型
Animal a = new Dog();
a.sleep();
Animal是Dog的父类;
a属于Animal类型,可以调用Animal中声明的方法;
a属于Dog对象,最终调用Dog中重写的方法;
- Animal中有sleep()声明,Dog中没有:调用Animal中的sleep
- Animal中没有sleep():编译出错
- Animal中有sleep()声明,Dog中有:调用Dog中的sleep
编译时类型(编译器) = 运行时类型(JVM)
编译时类型:决定了对象能调用哪些属性和方法
运行时类型:决定了对象最终调用的是哪个方法(先找子类,没有再找父类)
//父类
public class Animal extends Object {
// 属性
String name;
String sex;
// 构造器
public Animal(String name) {
this.name = name;
sex = "公";
}
public Animal() {
}
// 功能
public void eat() {
System.out.println("动物吃!");
}
public void sleep() {
System.out.println("动物睡!");
}
//子类
public class Dog extends Animal {
int age;
public Dog() {
// super父类对象,使用方式和this一样
super("旺财");// 子类构造器中默认添加的
/*super.name = "";
super.eat();*/
}
public void wang() {
System.out.println("汪汪!");
}
}
public class TestFather {
// 测试 Dog 和 Animal关系
@Test
public void test01() {
// 创建一个子类对象
Dog d = new Dog();
// 调用父类属性
d.name = "小强";
d.sex = "公";
// 调用父类方法
d.sleep();
d.eat();
// 调用子类自己的属性和方法
d.age = 10;
d.wang();
// 创建一个父类对象
Animal a = new Animal();
}
@Test
public void test02() {
// Dog的构造器空的,将成员变量初始化了
// 初始化位置:Animal的构造器
// 结论:子类构造器中会调用父类构造器Animal()
Dog d = new Dog();
System.out.println(d.name);
}
}
类与对象
类的构造器
*new用来实例化对象,构造器用来初始化成员变量
class 类名{ 成员变量、成员方法、构造方法 }
public class Cell {
// 类名
int row;
int col;
public Cell() {//无参构造器
//成员变量
}
//构造方法
public Cell(int row, int col) {
this.row = row; // 就近原则
this.col = col;//this对象-当前对象
}
// 左移,成员方法
public void moveLeft() {
col --;
}
// 右移
public void moveRight() {
col ++;
}
// 下移
public void drop() {
row ++;
}
Cell c1 = new Cell(0, 3);// 创建方块 new, 调用了类的构造方法/构造器
}
Java提供了4种访问控制符,主要用于控制其他类是否可以访问某一类中的属性或方法,从而实现数据封装。四种访问控制符的权限大小(由大到小)为public(公共)、protected(保护)、default(默认)、 private(私有)。
对象
符合类的特征的真实个体
创建对象:new 类();
new:分配空间、创建对象并且成员变量默认值
类():调用了构造器
Java编译过程
Cell cell = new Cell();
xx.java -> 编译(javac编译器) -> xx.class
将xx.class文件,装载(加载)到内存中,类加载器完成 -> 运行
类加载只有一次,类信息只有一个,静态属性只有一个