特性之封装
一,概念
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
二,实现途径
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用
最常用的就是通过四中访问限定符(public protected default private)
具体访问权限如上图(当我们不写修饰符时,系统默认为default)
三,封装的优点
- 通过方法来控制成员变量的操作,提高了代码的安全性
- 把代码用方法进行封装,提高了代码的复用性
特性之继承
一,概念
- (为什么要有继承)面相对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用
- 是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性
的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用
二,继承的实现
//继承的基本语法
修饰符 class 派生类类名 extends 基类类名{
......
}
代码实现
//以之前的动物类为例,先写一个基类
public class Animal {
public String name;
public int age;
public void eat(){
System.out.println(name + "吃东西!");
}
public void sleep(){
System.out.println(name + "睡大觉!");
}
}
//再写一个狗类
public class Dog extends Animal {
public void bark(){
System.out.println(name + " 汪汪叫!");
}
}
//在写一个猫类
public class Cat extends Animal{
public void mew(){
System.out.println(name + " 喵喵叫!");
}
}
public class TestAnimal {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "金毛";
dog.age = 2;
dog.eat();
dog.sleep();
dog.bark();
System.out.println();
Cat cat = new Cat();
cat.name = "猫猫";
cat.age = 1;
cat.eat();
cat.sleep();
cat.mew();
}
}
结论:
- 在狗的类或者猫的类(派生类)中我们并没有编写名字和年龄的成员变量,然而在狗类中却可以实现说明完成对基类的继承
- 一般在派生类中需要新编写成员变量或者成员方法,来体现出与基类的不同,否则也没有继承的必要
三,基类成员访问
1.基类成员变量访问
- 派生类要访问的成员变量自己有,就先访问自己的
- 派生类要访问的成员变量自己没有,就访问基类的,如果基类也没有,那么就会编译报错
- 派生类要访问的成员变量自己有,基类也有,那么会优先访问自己的
- 总结就是:成员变量访问遵循就近原则,派生类自己有就优先访问自己的,自己没有就访问基类的
2.基类成员方法访问
- 通过派生类对象访问基类与子类中不同名方法时,优先在子类中找,找到则访问,否则在基类中找,找到则访问,否则编译报错
- 通过派生类对象访问基类与子类同名方法时,如果基类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;如果基类和子类同名方法的原型一致(重写),则只能访问到子类的,基类的无法通过派生类对象直接访问到
四,派生类构造方法
在派生类构造方法中,并没有写任何关于基类构造的代码,但是在构造派生类对象时,先执行基类的构造方法,然后执行派生类的构造方法,因为:派生类对象是一个基类对象,在构造派生类对象时,先要将从基类继承下来的成员初始化完整,然后再初始化派生类自己新增加的成员
- 若基类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
- 如果基类构造方法是带有参数的,此时编译器不会再给子类生成默认的构造方法,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的基类构造方法调用,否则编译失败
- 在子类构造方法中,super(...)调用基类构造时,必须是子类构造函数中第一条语句
- super(...)表只能在子类构造方法中出现一次,并且不能和this同时出现(this也需要在第一条语句的位置)
五,super关键字
主要作用:在子类方法中访问父类的成员并且只能在非静态方法中使用
//访问基类成员变量
super.a = xxx;
super.b = xxx;
//访问基类成员方法
super.method();
六,初始化时代码执行顺序
没有继承关系时
- 静态代码块
- 实例代码块
- 构造方法
有继承关系时
- 静态代码块(基类的先执行,派生类的后执行,且只在程序运行时执行一次)
- 基类的实例代码块和构造方法
- 派生类的实例代码块和构造方法
七,Java中的继承类型
单继承
public class B extends A
多重继承
public class B extends A
public class C extends B
不同类继承自同一个类
public class B extends A
public class C extends A
八,final关键字
- 修饰变量和字段表示常量,即不能被修改
- 修饰类,表示这个类不能被继承
- 修饰方法,表示这个方法不能被重写
以修饰常量为例
九,继承和组合
在继承和组合都可以使用的情况下,尽量多使用组合