20200925冯强

1.学习总结:

1.封装

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。在电子方面,封装是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接。

1.1Java中的访问修饰符

Java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节。访问控制分为四种级别:
  (1)public: 用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;
  (2)protected: 用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问(此处稍后解释),protected重点突出继承;
  (3)default: 如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默
   认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包;
  (4)private: 用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它。

image-20200925225642225

修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Person {
private String name;
private int age;
}
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,即get and set

如:

public class People {
    private String name;
    private Integer age;
    private Dog dog;

    public People(String name, Integer age, Dog dog) {
        this.name = name;
        this.age = age;
        this.dog = dog;
    }

    public People() {
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", dog=" + dog +
                '}';
    }

2.继承

从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属性和实例属性)、方法(包括类方法和实例方法)、构造器和初始化块(包括类的初始化块和实例的初始化块)。对于继承中的初始化顺序,又具体分为类的初始化和对象的初始化。

类初始化:

在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间。并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

对象初始化:

在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属性和初始化块先分配内存并执行初始化。然后执行父类构造器中的初始化程序,接着才开始对子类的对象属性和初始化块执行初始化。

注:

  1. 在对象初始化阶段,属性和方法均针对子类可以从父类继承过来的属性和方法而言,一般而言,都是针对父类中非private而言的。

因为private修饰的为父类所特有的,子类没有继承过来,当new子类时,无须为其分配空间并执行初始化。当然了,父类的构造器子类也是不继承过来的,但构造器另当别论。

  1. 类的初始化只执行一次,当对同一个类new多个对象时,类属性和类初始化块只初始化一次。

    3.继承中的隐藏:

    隐藏含义:实际上存在,但是对外不可见。

    Java类具有三种访问控制符:private、protected和public,同时当不写这三个访问控制符时,表现为一种默认的访问控制状态。因此,一共具有四种访问控制级别。

    具体访问控制表现如下:

    private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;

    default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;

    protected修饰的属性或方法在同一个包中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;

    public修饰的属性或方法外部类中都可以直接访问。

    当子类继承父类,子类可以继承父类中具有访问控制权限的属性和方法(一般来说是非private修饰的),对于private修饰的父类所特有的属性和方法,子类是不继承过来的。

    当子类需要改变继承过来的方法时,也就是常说的重写父类的方法。一旦重写后,父类的此方法对子类来说表现为隐藏。以后子类的对象调用此方法时,都是调用子类重写后的方法,但子类对象中想调用父类原来的此方法时,可以通过如下两种方式:

    1.将子类对象类型强制转化为父类类型,进行调用;

    2.通过super调用。

    同样的,如果在子类中定义父类中相同名称的属性时,父类属性在子类中表现为隐藏。

    4.继承中的this和super:

    构造器中的this表示当前正在初始化的对象引用,方法中的this表示当前正在调用此方法的对象引用。this具体用法表现在一下几个方面:

    1.当具多个重载的构造器时,且一个构造器需要调用另外一个构造器,在其第一行使用this(param)形式调用,且只能在第一行;

    2.当对象中一个方法需要调用本对象中其他方法时,使用this作为主调,也可以不写,实际上默认就是this作为主调;

    3.当对象属性和方法中的局部变量名称相同时,在该方法中需要显式的使用this作为主调,以表示对象的属性,若不存在此问题,可以不显式的写this。

    其实,其牵涉到的一个问题就是变量的查找规则:先局部变量 => 当前类中定义的变量 => 其父类中定义的可以被子类继承的变量 => 父类...

    super表示调用父类中相应的属性和方法。在方法中,若需要调用父类的方法时,也一定要写在第一行

    1. 继承与组合:

    从单纯的实现效果上看,继承和组合都能达到同样的目的。并且都是实现代码复用的有效方式。

    但在一般性的概念层次中,两者具有较为明显的差别。

    继承表现为一般——特殊的关系,子类是一个特殊的父类,是is-a的关系。父类具有所有子类的一般特性。

    组合表现为整体——部分关系,即has-a关系。在组合中,通过将“部分”单独抽取出来,形成自己的类定义,并且在“整体”

    这个类定义中,将部分定义为其中的一个属性,并通过get和set方法,以此可以调用“部分”类中的属性和方法。

    2.问题

    public void quickSort(int [] arr,int begin,int end) {
    if(begin>end) {
    return;
    }
    int i=begin;
    int j=end;
    int t;
    //定义基准数
    int key =arr[i];
    while(i<j) {
    //先判断数组右边的
    while(key<=arr[j]&&i<j) {
    j--;
    }
    //左边
    while(key>=arr[i]&&i<j) {
    i++;
    }
    if(i<j) {
    t=arr[i];
    arr[i]=arr[j];
    arr[j]=t;
    }
    }
    arr[begin]=arr[i];
    arr[i]=key;
    quickSort(arr, begin, j-1);
    quickSort(arr, j+1, end);
    }

    快速排序时间复杂度比冒泡小

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1