面向过程编程和面向对象编程的区别在于:面向过程编程强调的是整个软件系统由一个个函数构成,最小的程序单元是函数,其中作为程序入口的函数称之为主函数,主函数依次调用其他函数,普通函数之间可以相互调用,从而实现整个系统的设计。 面向对象的设计是使所需要的对象具备某些功能,强调的是具备某些功能的对象。面向对象主要有三大特征:封装(Encapsulation),继承(Inheritance),多态(Polymorphism)。
面向对象的特征
- 封装:封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的”高内聚、低耦合“,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。
- 继承: 继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
- 多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行时才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能确定。多态性增强了程序的灵活性和扩展性。
接口和抽象类区别
接口的特点:
- 接口中的方法,永远都被public来修饰
- 接口中没有构造方法,也不能实例化接口对象
- 接口中只有方法的声明,没有方法体
- 接口中只有常量,如果定义变量,在编译的时候会默认加上“public static final”
- 接口中定义的方法都需要实现类来实现,如果实现类不能实现接口中的所有方法,则实现类需定义为抽象类
- 静态方法不能被子类覆盖(隐藏),因此接口中不定声明静态方法
- 使用接口可以实现多继承
抽象类关键字和哪些关键字不能共存?
final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
private:抽象类中的私有的抽象方法,不被子类所致,就无法被复写。而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,直接类名调用就可以了。
抽象类的特点
- 如果一个类中有抽象方法,那么这个类一定是抽象类
- 抽象类中不一定有抽象方法
- 抽象类中的所有抽象方法需要有子类实现,如果子类不实现,则子类也需要定义为抽象的
- 抽象类不可以用new创建对象,因为调用抽象方法没意义
权限修饰符
public: 任何地方都可以访问
protected: 同包中的类和不同包的子类中可以访问,但是protected关键字不可以修饰类名
default:缺省包只有相同包和相同包下的子类可以访问。
private: 本类内可以访问。
对象生命周期
创建阶段(Created)、应用阶段(In Use)、不可见阶段(Invisible)、不可达阶段(Unreachable)、收集阶段(collected)、终结阶段(Finalized)、对象空间重分配阶段(De-allocated)。
static 关键字
- 在静态方法中不能直接访问实例方法和实例变量
- 在静态方法中不能使用this和super关键字
- 静态方法不能被abstract修饰
- 当类被加载时,静态代码块只能被执行一次。
静态属性和静态方法能被继承吗?静态方法是否能被重写呢?
静态属性和静态方法可以被继承和重写,但无法实现多态。
final 关键字
- final 变量必须被显式初始化,并且只能被赋一次值
- final 修饰基本类型变量的时候,该变量不能重新赋值
- final 修饰引用类型变量的时候,该变量不能重新指向其他对象
- final 修饰的方法为最终的方法,该方法不能被重写
- private 类型的方法都默认为是final方法,因而也不能被子类重写
- final修饰的类为最终的类,不能被继承。
八大基本数据类型&引用类型
基本数据类型:
简单类型 | boolean | byte | char | short | int | long | float | double | void |
---|---|---|---|---|---|---|---|---|---|
二进制位数 | 1 | 8 | 16 | 16 | 32 | 64 | 32 | 64 | - |
封装器类 | Boolean | Byte | Character | Short | Integer | Long | Float | Double | Void |
初始值 | false | 0 | 0 | 0 | 0 | 0.0 | 0.0 | - |
引用类型:
Java有5种引用类型(对象类型):类 接口 数组 枚举 标注。引用类型的初始值为 null
堆内存和栈内存详解
Java 把内存分为两种,一种叫做栈内存,一种叫做堆内存
1 | String s; |
这里创建对象的引用,并非对象。直接使用会报错,因为没有赋值-指向任何对象。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
堆内存:用于存放由new创建的对象或数组。在堆中分配的内存,有java虚拟机自动回收器来管理。在堆中产生一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的别名或者代号。
栈内存:引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的对象,这就是Java中的指针。
总结: 栈内存中保存的是对象的引用,而Java对象保存在堆内存上。
参考资料
https://blog.csdn.net/Xk632172748/article/details/51755438