一、类和对象
面向对象编程的核心:找对象-创建对象-使用对象-维护对象。
对象由类生成,由类产生对象的过程叫实例化。
创建类:
class 类名{
- 字段(属性) (成员变量) 定义在方法外部,类的内部
- 方法(行为)
}
由类定义的变量是一个引用变量,在栈上开辟内存。类内的方法存在方法区。调用方法时,还是在栈上开辟空间。
1.类的成员
1.字段(属性)(成员变量):在类的内部,方法的外部。
默认规则:对于各种数字类型,默认值是0;对于布尔类型,默认值是false;对于引用类型,默认值为null;
成员变量:静态成员变量(也叫类变量)(当前成员变量被static修饰),普通成员变量。
静态成员变量建议通过 类名.静态成员变量 进行访问。
静态的好处是不需要实例化对象(因为通过类名.静态成员就可以访问)
静态的成员变量不存在于对象里,在方法区。
2.方法(成员方法)
静态的方法也是用类名调用
2.关于静态的其他问题
在静态的方法内部可以定义普通的变量
在普通的方法内部不可以定义静态变量,因为本来可以通过类名直接调用静态变量,但是如果在普通的方法内部,还需要创建对象,通过对象来调用该方法,相矛盾,所以不可以。
也即:如果在方法的内部的变量,它是一个局部变量,它的作用域在方法内部,而被static修饰的,全局可见,矛盾,所以不可以。
静态方法的内部不可以调用普通的方法,因为普通的方法需要创建对象来调用,而静态方法只需要类名即可调用。
普通的方法内部可以调用静态方法
静态方法本身的调用 是 不依赖于对象的。
静态方法不能直接使用非静态数据成员或调用非静态方法
3.封装
继承,封装,多态,组合都是面向对象思想的特征。
什么是封装:
语法层次上:字段和方法都被private修饰,此时就说,把这个字段或者方法进行了封装。
被private修饰的字段和方法只能在当前类内使用。
封装的意义:安全,降低了对类的使用成本
4.构造方法
实例化对象一共需要两步:1.为对象分配内存。2.调用合适的构造方法。
构造方法没有返回值,方法名称与类名一样。不能写void,void代表无返回值类型。
当你没有写构造方法的时候,编译器会帮你默认生成一个不带参数的构造方法。new的时候就调用了不带参数的构造方法。当你写了构造方法,编译器就不会再帮你自动生成了。
this.name = name;中的this代表当前对象的引用,而非当前对象。
this的三种使用方式:1.调用属性。2.调用方法。3.调用构造方法
5.认识代码块
代码块分类:1.本地代码块2.实例代码块/构造代码块3.静态代码块4.同步代码块,等等。
- 本地代码块:在方法内部定义的代码块
- 实例代码块:方法的外部,类的里面,的代码块
- 静态代码块:static{ }
代码块的出现只是为了在合适的时候处理一些数据
代码块执行的顺序是:静态代码块,实例代码块,构造方法。与它们的先后顺序无关。且静态代码块只执行一次。
6.匿名对象
匿名只是表示没有名字的对象。
·没有引用的对象称为匿名对象。
·匿名对象只能在创建对象时使用
·如果一个对象只是用一次,后面不需要用了,可以考虑使用匿名对象。
二、时间复杂度,空间复杂度 O()
复杂度:衡量一个算法的效率
1.时间复杂度
算法中的基本操作的执行次数,为算法的时间复杂度
推导时间复杂度大O阶的方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶。
2.空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。
空间复杂度大O阶的推导方法与时间复杂度的一样。