特性之封装 

一,概念

将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

二,实现途径

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用

最常用的就是通过四中访问限定符(public   protected    default    private)

 

java 怎么执行受保护的方法 java保护继承_构造方法

具体访问权限如上图(当我们不写修饰符时,系统默认为default)

三,封装的优点

  • 通过方法来控制成员变量的操作,提高了代码的安全性
  • 把代码用方法进行封装,提高了代码的复用性

特性之继承

一,概念

  • (为什么要有继承)面相对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用
  •  是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性
    的基础上进行扩展,增加功能,这样产生新的类,称派生类
    。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用

二,继承的实现

//继承的基本语法

修饰符 class 派生类类名 extends 基类类名{

      ......
}

java 怎么执行受保护的方法 java保护继承_java_02

代码实现

//以之前的动物类为例,先写一个基类

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();
    }
}

 

java 怎么执行受保护的方法 java保护继承_构造方法_03

结论: 

  1.  在狗的类或者猫的类(派生类)中我们并没有编写名字和年龄的成员变量,然而在狗类中却可以实现说明完成对基类的继承
  2. 一般在派生类中需要新编写成员变量或者成员方法,来体现出与基类的不同,否则也没有继承的必要

 三,基类成员访问

1.基类成员变量访问

  • 派生类要访问的成员变量自己有,就先访问自己的
  • 派生类要访问的成员变量自己没有,就访问基类的,如果基类也没有,那么就会编译报错
  • 派生类要访问的成员变量自己有,基类也有,那么会优先访问自己的
  • 总结就是:成员变量访问遵循就近原则,派生类自己有就优先访问自己的,自己没有就访问基类的

2.基类成员方法访问

  • 通过派生类对象访问基类与子类中不同名方法时,优先在子类中找,找到则访问,否则在基类中找,找到则访问,否则编译报错
  • 通过派生类对象访问基类与子类同名方法时,如果基类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;如果基类和子类同名方法的原型一致(重写),则只能访问到子类的,基类的无法通过派生类对象直接访问到

四,派生类构造方法

在派生类构造方法中,并没有写任何关于基类构造的代码,但是在构造派生类对象时,先执行基类的构造方法,然后执行派生类的构造方法,因为:派生类对象是一个基类对象,在构造派生类对象时,先要将从基类继承下来的成员初始化完整,然后再初始化派生类自己新增加的成员

  • 若基类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
  • 如果基类构造方法是带有参数的,此时编译器不会再给子类生成默认的构造方法,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的基类构造方法调用,否则编译失败
  • 在子类构造方法中,super(...)调用基类构造时,必须是子类构造函数中第一条语句
  • super(...)表只能在子类构造方法中出现一次,并且不能和this同时出现(this也需要在第一条语句的位置)

五,super关键字

主要作用:在子类方法中访问父类的成员并且只能在非静态方法中使用

//访问基类成员变量

super.a = xxx;
super.b = xxx;


//访问基类成员方法

super.method();

六,初始化时代码执行顺序

没有继承关系时

  1. 静态代码块
  2. 实例代码块
  3. 构造方法

有继承关系时

  1. 静态代码块(基类的先执行,派生类的后执行,且只在程序运行时执行一次)
  2. 基类的实例代码块和构造方法
  3. 派生类的实例代码块和构造方法

七,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关键字

  • 修饰变量和字段表示常量,即不能被修改
  • 修饰类,表示这个类不能被继承
  • 修饰方法,表示这个方法不能被重写

以修饰常量为例

java 怎么执行受保护的方法 java保护继承_构造方法_04

java 怎么执行受保护的方法 java保护继承_java 怎么执行受保护的方法_05

九,继承和组合

在继承和组合都可以使用的情况下,尽量多使用组合