搬砖也要搬的不一般。
一、前言
岁月匆匆而来,时光匆匆而去。转眼间,做java开发已有3、4年的时间了,期间做过后台开发,写过前端web,而最主要的则是做android开发。语言也接触过好多种,什么Python、Kotlin、swift、Js、C等等,而最让我迷恋的还是个java。
java的优点我便不多说了,网上有太多的解释。而本文则是我三年来对java的理解,以及对网上收集资料的总结,是最java进阶的知识整理。
进入编程的第四年,不应该仅仅处于java的使用,而java的理解才是一道不得不迈的一道坎。
二、java第一步:啥是面向对象
2种主流的开发方法:结构化程序设计和面向对象程序设计;
* 结构化程序设计:
理解:
结构化程序设计就是将程序功能,进行一层一层的剥离,进行功能细分。一个细分功能就是一个函数,然后再由上层函数进行调用,在函数的层层调用之后,最终由主函数进行调用,实现完整的功能。
原则:
自顶向下、逐步求精、模块化。
* 面向对象程序设计:
理解:
1.什么是对象?
对象是实际存在的该类事物的个体,即对象是类的实例化,现实中的万物都可以理解为一个对象;
如:一辆汽车,将其抽象为具体的属性,即速度、大小、颜色、座位数等属性,以及具体的行为,即加速、刹车、载客等行为。
2.什么是对象?
类是具有共同属性和行为的一组对象的抽象。类是对象的抽象表现,是对象在代码中的具体表现形式;它必须具有属性和行为,才是一个完整的对象。
3.对象就是类?
对象是类的实例化,而类是对象的抽象;
类是面向对象编程中的最小的单元,但是类并不一定是一个对象,而类只是对象的一种表现形式;
对象可以是一个类,也可以是一个函数,或者多个类的集合,即万物皆可为对象;
而有些类在严格的意义上来讲,却并不是一个对象;
如: 一个仅仅包含常量的类,就不是一个对象。它仅仅具有属性缺不具有行为。
4.面向对象的特征
封装、继承、多态
- 封装:
是把对象的属性和行为结合成一个整体,对细节隐藏,对操作开放。
如:一台智能手机,你不要关心手机内部有什么?怎么运行的程序?你只要点亮屏幕,就可以实现打电话、玩游戏、聊天等功能。
java的封装由权限修饰符:private、public、protected、default实现;
- 继承:
是对一系列对象的公共属性和行为进行提取封装,而后由其他类继承,并实现自己独有的属性或行为。
父类独立于子类,而子类则依赖于父类。
如:水果是一个父类,其具有酸、甜等属性,也具有吃、腐烂等行为;而橘子也是水果的一种,它不仅具有父类的属性,同时还具有剥皮的特殊行为。因此,橘子是水果的一个子类,它实现了父类的所有方法,但要独立实现剥皮的行为。
简单说,没有橘子,水果依旧还是水果。但是,橘子如果不能吃,那他就一定不是水果。
java的继承使用extends或implements进行标记,通过override(重写)标记父类的行为,通过super实现父类的方法。
- 多态:
是对象的同种行为的不同表现形式。
多态仅仅针对行为,与属性无关。
java的多态可以划分为同一个类中的多态(重载),以及父类与子类间的多态(重写)
如:‘吃’这个行为。可以表现为,吃饭、吃水果、吃茶等等。
java的多态,由重写(override)和重载(overload)来实现;
三、对象的番外篇
1.权限修饰符
修饰符 | 类内部 | 本包 | 子类 | 外部包 |
---|---|---|---|---|
public | 可访问 | 可访问 | 可访问 | 可访问 |
protected | 可访问 | 可访问 | 可访问 | |
default | 可访问 | 可访问 | ||
private | 可访问 |
备注:⚠️没有填写的内容为不可访问。
问题:被protected标注的外部包的子类是否可以访问?
答:可以访问的,类优先与包,而被protected标注的变量,在子类中是可以访问的。
2.重写和重载的对比
- 什么是重写?
重写父类与子类之间的多态性,是子类对父类的方法重新定义,可以实现父类的方法,也可以不实现父类的方法。
即,方法名、参数与返回值完全相同,且子类方法的访问权限不可以小于类;
- 什么是重载?
重载是在同一个类中,相同的行为的不同表现形式。
即,方法名相同,参数的个数或类型不同,返回值可以相同,也可以不同。
- 概述
重写与重载是java多态性的具体表现形式.
⚠️使用的原则是:相同的行为,表现形式不同时使用。
参考链接
3.普通类、抽象类和接口的区别
普通类:
是具有一系列属性和行为的类,它可以被实例化成一个对象。抽象类:
是普通类的抽象形式,它仅仅代表一个分类或抽象概念,它的实例化没有任何意义,因此不希望它被实例化。即,抽象类并不是一个完整的对象。
特征:
1.抽象类使用abstract class对类名进行标记;
2.抽象类可以有抽象方法,也可以没有抽象方法,其使用 abstract标记;
3.抽象类不可以被实例化;
4.抽象类可以有普通方法,并实现具体行为。
5.抽象类的子类,必须实现父类的抽象方法,或者子类也是抽象类。
6.抽象类通过extends使用,一个类只能继承一个抽象类。接口:
接口是特殊的抽象方法,在接口中所有的方法都是抽象方法。
特征:
1.接口使用interface对类名进行标记;
2.接口中全部都是抽象方法,不可以写方法的实现,由子类实现具体的行为;
3.接口不可以被实例化;
4.接口通过implements使用,一个类可以实现多个接口。接口和抽象类的之间的区别。
1.变量,抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态的常量。
2.方法,抽象类中可以有非抽象方法,而接口中只能拥有抽象方法。
3.接口可以多继承,抽象类只能继承一个。接口和抽象类的使用场景
在考虑使用抽象类还是使用接口时,应该从以下两点出发。
1.父类中不需要实现具体的功能,使用接口;
2.子类需要继承多个父类,才能实现完整的功能时,使用接口;
其他情况,一般会使用抽象类。
参考链接
4.类的初始化流程
父类:
public class ClassA {
//构造方法
ClassA() {
System.out.println("父类-构造方法");
}
//非静态代码块
{
System.out.println("父类-非静态代码块");
}
//静态代码块
static {
System.out.println("父类-静态代码块");
}
//静态方法
public static void mothedA() {
System.out.println("父类-静态方法");
}
}
子类:
public class ClassB extends ClassA {
//构造方法
ClassB() {
System.out.println("子类-构造方法");
}
//非静态代码块
{
System.out.println("子类-非静态代码块");
}
//静态代码块
static {
System.out.println("子类-静态代码块");
}
//静态方法
public static void mothedB() {
System.out.println("子类-静态方法");
}
//静态方法
public static void mothedA() {
System.out.println("父类-静态方法");
}
}
备注:
1.父类的方法优先与子类的方法;
2.同一个类中的非静态代码块与构造方法先后执行,执行完成后才会执行到子类;
3.若直接调用静态方法,优先于非静态代码块。
调用方式 | 执行顺序 |
---|---|
new ClassA(); | 父类-静态代码块 子类-静态代码块 父类-非静态代码块 父类-构造方法 |
new ClassB(); | 父类-静态代码块 子类-静态代码块 父类-非静态代码块 父类-构造方法 子类-非静态代码块 子类-构造方法 |
ClassA.mothedA(); | 父类-静态代码块 子类-静态代码块 父类-静态方法 |
ClassB.mothedA(); | 父类-静态代码块 子类-静态代码块 父类-静态方法 |
ClassB.mothedB(); | 父类-静态代码块 子类-静态代码块 子类-静态方法 |
总结:
1.直接调用静态方法,即没有实例化,不会运行非静态代码块和构造方法;
2.同一个类中的非静态代码块与构造方法先后执行,执行完成后才会执行到子类;
3.相同方法,父类优先于子类;
以上是我对java象的简单理解。
若有问题,欢迎指正、留言,欢迎大家一起讨论。