1 POP & OOP
- POP: C语言,典型面向过程的编程语言。强调过程,但无法对不同的对象作出更“大众化” 的事。
- 过程是编程是最应该思考的,但OOP编程语言必须先以服务“对象”作为终极目标,才能开始逐步细化其细节上需要处理的问题。如此一来,OOP类编程语言才能发挥它真正的作用。
- features: Java程序,大众化,强调目标,不强调过程。切忌用“走一步看一步”的思维模式去考虑Java程序。
2 程序设计思路
- 考虑程序的共性,共性是程序大众化的关键。
- 对象: 一种具有某种相同共性的名词代表,在Java中,创建对象实质上就是创建一个可以由程序用户操作的Java类(class);
- 实例: 不同的具有相似或相同Features的实例可以与同一对象匹配,实例实际上是程序用户使用对象程序自行创建的,可以多次修改的的对象的参数。
- 比较: 实例是对抽象性事物的表达或具象化。
3 数据操作安全性 && OOP
3.1 访问修饰符
-
default: (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
-
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
-
public : 对所有类可见。使用对象:类、接口、变量、方法。
-
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
3.2 封装
- 把成员变量修饰符
public换成private,使用Getter&Setter方法,称为OOP—— 封装。 - 操作成员变量的
“setter”&“getter”:为限制用户操作和修改成员变量的范围,需要通过private修饰符和setter()与getter()方法结合的方式来确保程序的安全性。
3.3 输出对象
lombok提供多种辅助工具,包括ToString()方法;
ToString()方法实现对象的属性输出。
3.4 构造方法(构造函数)
构造方法用于声明对象时直接对其一些属性初始化。
-
构造方法的作用: 取代用户必须在软件程序当中对每一个成员变量的一步一步地循环“声明+定义”的过程,构造方法将简化用户的操作复杂度,使用户直接输入注册信息,即从用户的角度来直接实现对已声明成员变量的定义。
-
notice1:此类构造方法对任何原有方法和自主创建方法均符合。只要创建类,就会存在无参数构造方法:(无参构造器:Constructor)原有方法会隐藏无参构造器,自行创建的方法需要自行添加。
-
notice2:若自行创建的方法不添加无参构造器,则会在调用时出现如果不赋值给成员变量而出现报错的情况。
4 GC 垃圾回收
垃圾回收是指指示JVM对无效的声明过的的变量或方法进行内存释放,使后续程序运行效率变快。
5 静态变量与静态方法
-
静态变量:赋予调用所属类的所有对象的统一属性。 静态变量是属于类的属性,而不属于单一对象。
-
静态方法:静态方法应用模式:
// 私有静态变量(与public static String getPlotInstance()合用),安全性较高。 private static String plot ="ZhongHuaPlot"; /** * 拿到plot实例,返回实例。 * 注意:此静态方法属于Humans类,实例对象无法调用。 */ public static String getPlotInstance(){ return plot; }静态方法属于类,实例对象无法调用。
6 Singleton Pattern 单例模式
- 在Java中,Singleton pattern 用于创建只能赋值一次且无法再次修改的单一对象。
- 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例适用情况:
- 有频繁实例化然后销毁的情况,也就是频繁的 new 对象,可以考虑单例模式;
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象;
- 频繁访问 IO 资源的对象,例如数据库连接池或访问本地文件。
7 Null Pointer Exception 空指针异常
当你试图对一个已经注销的对象进行操作时,IDEA会报空指针异常。
对象注销方式:Object = null; 使对象指针指向空。
8 方法重载
方法名相同,参数个数或参数类型不同。
- 主方法在调用其他方法名相同的不同方法时,会自动选择参数个数和参数类型与之匹配的方法。
9 Extends 继承
- 一个类可以通过继承其他某个类来包含被继承的类的成员变量和成员方法。
public class SonClass extends FatherClass {
}
- 继承可以嵌套,例如:
public class SonClass extends FatherClass(){
}
public class SonClass extends GrandsonClass(){
}
// Transfer objectTwo 继承的仍然是 FatherClass();
SonClass objectOne = new FatherClass();
Grandson objectTwo = new SonClass();
9.1 super和this的异同
super在一个类中用来引用其父类的成员,它是在子类中访问父类成员的一个桥梁,并不是任何一个对象的引用,而this则表示当前类对象的引用。在代码中Object o = super;是错误的,Object o = this;则是允许的。 super关键字的作用在于当子类中覆盖了父类的某个成员变量,或者重写了父类的某个成员方法时还能够访问到父类的成员变量和成员方法。如果子类中没有重写父类的成员变量和成员方法,则子类会继承父类的所有非private的成员变量和成员方法。这时在子类中无论通过this来访问成员和通过super来访问成员,结果都是一样的。
-
final关键字final关键字可以使类或方法不能再重写;final关键字说明变量,方法,类都是不可修改的。常量命名原理既如此。
-
abstract关键字 :抽象类关键字使此类无法被直接调用,此用法具有现实意义。抽象类是笼统的概括一个分类的统一特性,在使用时,人往往站在实际的角度看问题,而不是类。
-
抽象方法:
抽象方法只能出现在抽象类中,即想要在一个类中使用抽象方法,首先必须把类定义为抽象类。抽象方法没有方法体,实际意义为抽象方法无法说明某一个实例的特征或行为。
10 接口
interface 关键字 :文件类型,接口;
-
接口的特征: 接口中所有的方法都是抽象的
-
调用接口:因接口中的方法无法被直接调用,所以必须像集成那样写”子类“:
public class TestInterfaceClass implemant TestInterface(){ }
11 抽象类与接口的区别
11.1 相同点
-
都不能被实例化;
-
接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
11.2 不同点
-
接口只有定义,不能有方法的实现。
-
实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
-
接口强调特定功能的实现,而抽象类强调所属关系。
-
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
见解reference:
本身的设计目的就是不同的。 大家讲的都很详细了,我说说我自己的一点浅薄的理解。我一直认为,工科的知识有个很明显的特点:“以用为本”。在讨论接口和抽象类的区别时,我也想从“用”的角度试着总结一下区别,所以我想到了设计目的。接口的设计目的,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。对“接口为何是约束”的理解,我觉得配合泛型食用效果更佳。而抽象类的设计目的,是代码复用。 当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用到A-B时,无法执行)。
作者:阿法利亚 链接:www.zhihu.com/question/20…
来源:知乎
12 多态
多态是同一个行为具有多个不同表现形式或形态的能力,就是同一个接口,使用不同的实例而执行不同操作。
12.1 多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:**`Parent p = new Child();`** 【向上转型】
12.2 多态的好处
可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
附录
Arrays类 举例
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:
- 给数组赋值:通过 fill 方法。
- 对数组排序:通过 sort 方法,按升序。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过
binarySearch方法能对排序好的数组进行二分查找法操作。
-
public static int binarySearch(Object[] a, Object key)用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。 -
public static boolean equals(long[] a, long[] a2)如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 -
public static void fill(int[] a, int val)将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 -
public static void sort(Object[] a)对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
Attention
-
类当中的变量和方法统称为属性,属性可分为共有性和特殊性。
-
方法(函数)在类当中,称为——行为,即动作。
-
成员变量:成员变量组成和构成了类,他们是类的重要组成部分。
-
内部类: 很少使用。同一Java文件一般只创建一个类。
- 一个Java文件中只能有一个public class{}.
IDEA hotkey
Intellij IDEA basic hotkey
- 编译运行当前程序: shift + F10
- 编译运行程序选择: shift +Alt + F10
- 呼出 Explorer : Alt +1
- 类的改名 : shift +F6
- 呼出创建选项框 : Alt +insert
- Ctrl+G 跳转到指定行
- Ctrl+F4 关闭当前编辑页面
- Ctrl+F 搜索
- Alt+回车 导入包,自动修正
- Ctrl+N 查找类
- Ctrl+Shift+N 查找文件
- Ctrl+Alt+L 格式化代码
- Ctrl+Alt+O 优化导入的类和包
- Alt+Insert 生成代码(如get,set方法,构造函数等)
- Ctrl+E或者Alt+Shift+C 最近更改的代码
- Ctrl+R 替换文本
- Ctrl+F 查找文本
- Ctrl+Shift+Space 自动补全代码
- Ctrl+空格 代码提示
- Ctrl+Alt+Space 类名或接口名提示
- Ctrl+P 方法参数提示
- Ctrl+Shift+Alt+N 查找类中的方法或变量
- Alt+Shift+C 对比最近修改的代码
- Shift+F6 重构-重命名
- Ctrl+Shift+先上键
- Ctrl+X 删除行
- Ctrl+D 复制行
- Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/…/ )
- Ctrl+J 自动代码
- Ctrl+E 最近打开的文件
- Ctrl+H 显示类结构图
- Ctrl+Q 显示注释文档
- Alt+F1 查找代码所在位置
- Alt+1 快速打开或隐藏工程面板
- Ctrl+Alt+ left/right 返回至上次浏览的位置
- Alt+ left/right 切换代码视图
- Alt+ Up/Down 在方法间快速移动定位
- Ctrl+Shift+Up/Down 代码向上/下移动。
- F2 或Shift+F2 高亮错误或警告快速定位
- 代码标签输入完成后,按Tab,生成代码。
- 选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
- Ctrl+W 选中代码,连续按会有其他效果
- 选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
- Ctrl+Up/Down 光标跳转到第一行或最后一行下
- Ctrl+B 快速打开光标处的类或方法
Intellij IDEA common hotkey
- Ctrl+E,可以显示最近编辑的文件列表
- Shift+Click可以关闭文件
- Ctrl+[或]可以跳到大括号的开头结尾
- Ctrl+Shift+Backspace可以跳转到上次编辑的地方
- Ctrl+F12,可以显示当前文件的结构
- Ctrl+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择
- Ctrl+N,可以快速打开类
- Ctrl+Shift+N,可以快速打开文件
- Alt+Q可以看到当前方法的声明
- Ctrl+W可以选择单词继而语句继而行继而函数
- Alt+F1可以将正在编辑的元素在各个面板中定位
- Ctrl+P,可以显示参数信息
- Ctrl+Shift+Insert可以选择剪贴板内容并插入
- Alt+Insert可以生成构造器/Getter/Setter等
- Ctrl+Alt+V 可以引入变量。例如把括号内的SQL赋成一个变量
- Ctrl+Alt+T可以把代码包在一块内,例如try/catch
- Alt+Up and Alt+Down可在方法间快速移动
Search hotkey
- CTRL+N 查找类
- CTRL+SHIFT+N 查找文件
- CTRL+SHIFT+ALT+N 查找类中的方法或变量
- CIRL+B 找变量的来源
- CTRL+ALT+B 找所有的子类
- CTRL+SHIFT+B 找变量的类
- CTRL+G 定位行
- CTRL+F 在当前窗口查找文本
- CTRL+SHIFT+F 在指定窗口查找文本
- CTRL+R 在 当前窗口替换文本
- CTRL+SHIFT+R 在指定窗口替换文本
- ALT+SHIFT+C 查找修改的文件
- CTRL+E 最近打开的文件
- F3 向下查找关键字出现位置
- SHIFT+F3 向上一个关键字出现位置
- F4 查找变量来源
- CTRL+ALT+F7 选中的字符查找工程出现的地方
- CTRL+SHIFT+O 弹出显示查找内容
Auto coding
- ALT+回车 导入包,自动修正
- CTRL+ALT+L 格式化代码
- CTRL+ALT+I 自动缩进
- CTRL+ALT+O 优化导入的类和包
- ALT+INSERT 生成代码(如GET,SET方法,构造函数等)
- CTRL+E 最近更改的代码
- CTRL+SHIFT+SPACE 自动补全代码
- CTRL+空格 代码提示
- CTRL+ALT+SPACE 类名或接口名提示
- CTRL+P 方法参数提示
- CTRL+J 自动代码
- CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
CV hotkey
- CTRL+D 复制行
- CTRL+X 剪切,删除行
Others
- CIRL+U 大小写切换
- CTRL+Z 倒退
- CTRL+SHIFT+Z 向前
- CTRL+ALT+F12 资源管理器打开文件夹
- ALT+F1 查找文件所在目录位置
- SHIFT+ALT+INSERT 竖编辑模式
- CTRL+/ 注释//
- CTRL+SHIFT+/ 注释/…/
- CTRL+W 选中代码,连续按会有其他效果
- CTRL+B 快速打开光标处的类或方法
- ALT+ ←/→ 切换代码视图
- CTRL+ALT ←/→ 返回上次编辑的位置
- ALT+ ↑/↓ 在方法间快速移动定位
- SHIFT+F6 重构-重命名
- CTRL+H 显示类结构图
- CTRL+Q 显示注释文档
- ALT+1 快速打开或隐藏工程面板
- CTRL+SHIFT+UP/DOWN 代码向上/下移动。
- CTRL+UP/DOWN 光标跳转到第一行或最后一行下
- ESC 光标返回编辑框
- SHIFT+ESC 光标返回编辑框,关闭无用的窗口
- F1 帮助千万别按,很卡!
- CTRL+F4 非常重要下班都用
Uncommon hotkey
- 在一些地方按Alt+Enter可以得到一些Intention Action,例如将”==”改为”equals()”
- Ctrl+Shift+Alt+N可以快速打开符号
- Ctrl+Shift+Space在很多时候都能够给出Smart提示
- Alt+F3可以快速寻找
- Ctrl+/和Ctrl+Shift+/可以注释代码
- Ctrl+Alt+B可以跳转到抽象方法的实现
- Ctrl+O可以选择父类的方法进行重写
- Ctrl+Q可以看JavaDoc
- Ctrl+Alt+Space是类名自动完成
- 快速打开类/文件/符号时,可以使用通配符,也可以使用缩写
- Live Templates! Ctrl+J
- Ctrl+Shift+F7可以高亮当前元素在当前文件中的使用
- Ctrl+Alt+Up /Ctrl+Alt+Down可以快速跳转搜索结果
- Ctrl+Shift+J可以整合两行
- Alt+F8是计算变量值