共计 7728 个字符,预计需要花费 20 分钟才能阅读完成。
倡议看完目录后扔进收藏夹吃灰,须要用的时候再翻出来。(手动狗头)
本文次要包含 Java 入门的一些常识,包含 JDK 环境装置,罕用语法以及面向对象编程等。
【目录构造】
Java 根底 1,Java 语言的特点 2,配置开发环境 3,经典 HelloWorld3.1 命令行运行 Java 程序 3.2 应用 IDEA 运行 Java 程序 4,数据类型 & 变量 4.1 为什么要设计不同品种的数据类型?4.2 数据变量 & 类型的定义 4.3 根本数据类型 4.4 主动类型转换 & 强制类型转换 4.5 包装类面向对象 1,灵魂拷问,什么是面向对象?2,如何实现面向对象?——封装,继承,多态 2.1 封装 2.2 继承 2.3 多态 3,关键字盘点 3.1 static3.2 final
Java 根底
1,Java 语言的特点
- 基于 JVM 的跨平台语言
- 具备垃圾回收机制
- 生态弱小
2,配置开发环境
JDK 版本多样,次要包含 Oracle JDK 和 OpenJDK
反对国产的话能够思考阿里的 dragonwell:https://cn.aliyun.com/product/dragonwell
【win10 装置 JDK 的罕用步骤】
- jdk8 下载地址:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
【下载的这个安装包次要蕴含 JDK,JRE,JavaFx 包】(JavaFX 次要用于桌面端开发)
- 设置 jdk 装置门路
- 设置 jre 装置门路
-
设置环境变量
- 找到 jdk 装置的 bin 目录,复制装置门路
![1566378270545](https://img2020.cnblogs.com/blog/1401585/202007/1401585-20200714114815730-1502938281.png)
* 右键电脑抉择属性
![1566378337808](https://img2020.cnblogs.com/blog/1401585/202007/1401585-20200714114815475-1056133413.png)
增加刚刚复制的门路到 path 里:
点击三个确定。
- 查看是否装置胜利
java -version
java
javac
3,经典 HelloWorld
3.1 命令行运行 Java 程序
- 新建文件,命名为 HelloWorld.java
用记事本关上,输出
public class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}
- 关上命令行,定位到 HelloWorld.java 所在位置
javac HelloWorld.java // 编译
java HelloWorld // 运行
3.2 应用 IDEA 运行 Java 程序
- 装置 IDEA
https://www.jetbrains.com/idea/
- 配置 JDK
- 创立 Java 程序
- 输入 HelloWorld
package com.company;
public class Main {
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}
- 运行程序
4,数据类型 & 变量
4.1 为什么要设计不同品种的数据类型?
以后果为导向来剖析:Java 的整数类型分为 4 种:byte,short,int,long。四种的区别在于占用的存储空间不一样。
byte 占用 1 个字节,short 占用 2 个字节,int 占用 4 个字节,而 long 占用 8 个字节。
1 字节等于 8 位而八位能够示意数 -128 – 127。这是 byte 类型的示意范畴。那如果想用计算机计算 1000 加上 1000,byte 显著是不可用的。因为 byte 示意不了 1000 这个数值。
而 short 类型的存储空间为 2 个字节,也就是 16 位。对于 short 数据类型来说,能示意多大的数呢?依据 8 位的示意范畴推算:
-2^15 = 2^15-1 -32768–32767
以此类推,int 为 4 个字节,long 为 8 个字节,能示意的数更大。
Java 通过定义变量的类型来规定变量的内存空间大小,通过阶梯式的定义,既有满足小数值运行的 byte 类型,也有反对大数值运算的 long 类型。这样不仅满足运算的最大反对(long),同时也能节俭零碎内存资源(byte)。
【总结】
数据类型的辨别是一种零碎资源分配优化的计划。
【字节和位的关系】
字节是一种存储单位的度量。1 个字节等于 8 位。
位能够了解为计算机的最小单位:0 或者是 1。也就是是说 1 个字节是 8 个 0 和 1 的排列组合:
比如说:00000000,00000001,00000011,……11111111。
【实践上 1 个字节能够示意多大的数呢?】
- 在无符号位的状况下:
00000000 转换为十进制仍然是 0,11111111 转换为十进制是 255。
转换工具:https://tool.lu/hexconvert/
也就是说,一个字节最大能够示意 255 而最小 1 能够示意 0。
- 在有符号位的状况下:
如果 8 位示意负数和正数,那么 8 位能够示意的范畴是多大呢?
通常状况下,用第一位来示意正负【0 为正,1 为负】,这样算下来 8 位能够示意的范畴是 -127 到 +127。
【实际上 1 个字节能够示意多大的数呢?补码退场】
上述引入符号位的 8 位二进制数能够了解为原码。对于负数来说,原码就是补码,而对于正数来说,符号位不变,其余原码按位取反加 1 所得即为补码。
为什么须要补码?
补码的呈现使得加减法只有加法,简化了计算构造,进步运算速度。(减法变成了加一个正数)
【为什么 8 位二进制数补码示意的范畴是 -128-127?】
无符号位原码:0000 0000 – 1111 1111 示意范畴 0 – 255
有符号位原码:1111 1111 – 0111 1111 示意范畴 -127 – 127
补码:符号位不变,在原码的根底上按位取反加 1,实践上最大的数 0111 1111 = 127,最小的数 1111 1111 = -127
然而非凡状况:原码 0000 0000 实践上示意负数,也就是 +0,原码 1000 0000 实践上示意正数,变为补码后去掉最高为也是 0000 0000。
[+0]原码 =0000 0000,[-0]原码 =1000 0000
[+0]反码 =0000 0000,[-0]反码 =1111 1111
[+0]补码 =0000 0000,[-0]补码 =0000 0000
+ 0 的补码和 - 0 的补码都是 0000 0000。但 8 位二进制数的补码能够示意 2^8 也就是 256 个数 1 -127,-1-(-127)一共数 254 个数。
所以计算机将补码 -0(1000 000)非凡设为 -128。这个数没有原码和反码。
(就是多了一个示意的数,计算机就非凡解决了)
4.2 数据变量 & 类型的定义
变量是内存中的一个存储区域。而数据类型的定义决定了这块存储区域的大小。
比方 int x;其中 x 变量在内存中占有肯定空间,而 int 决定这个空间是 4 个字节。
【对于变量的形容】
- 变量是内存中的一个存储区域。【程序运行的时候,变量是放在内存里的】
- 存储区域的数据能够在同一类型范畴里一直变动【所以叫变量,就是能变嘛】
- 变量包含:例如【int x = 3】变量类型 int 变量名 x 变量的值 3
- 变量必须先申明后应用
int x = 10; (√)
x = 10; (×)
申明:变量必须得先指定具体的数据类型能力应用。
4.3 根本数据类型
4 类 8 种:4 种整数型,2 种浮点型,1 种字符型,一种布尔型
byte
1 字节
默认值
short
2 字节
0
int
4 字节
0
long
8 字节
0L
float
4 字节
0f
double
8 字节
0d
char
2 字节
‘u000’
boolean
4 字节
false
4.4 主动类型转换 & 强制类型转换
主动类型转换:由示意范畴小的主动转换为示意范畴大的。
强制类型转换:反向转换
4.5 包装类
包装类是 Java 设计之初提出的,次要解决根本数据类型无奈面对对象编程的问题。
装箱:根本数据类型 to 包装类
拆箱:包装类 to 根本数据类型
//int 与 Integer 之间的转换
int x = 5;
Integer y = new Integer(x);
System.out.println(“int 转换为 Integer,y=”+y);
int z = y.intValue();
System.out.println(“Integer 转换为 int,z=”+z);
System.out.println(“=======================”);
//Integer 与 String 转换
String s1 = “666”;
Integer i1 = Integer.parseInt(s1);
System.out.println(“String 转换为 Integer,i1=”+i1);
String s2 = i1.toString();
System.out.println(“Integer 转换为 String,s2=”+s2);
System.out.println(“=======================”);
//int 与 String 转换
int xx = 2;
String ss1 = String.valueOf(xx);
System.out.println(“int 转换为 String,ss1=”+ss1);
int yy = Integer.parseInt(ss1);
System.out.println(“String 转换为 int,yy=”+yy);
System.out.println(“=======================”);
//JDK1.5 后 Java 采取主动装箱和主动拆箱性能
// 主动装箱,编译器执行了 Integer x1 = Integer.valueOf(x)
Integer x1 = x;
System.out.println(“ 主动装箱,x1=”+x1);
// 主动拆箱,编译器执行了 int y1 = y.intValue()
int y1 = y;
System.out.println(“ 主动拆箱,y1=”+y1);
面向对象
1,灵魂拷问,什么是面向对象?
百度的解释:
面向对象 (Object Oriented) 是软件开发办法。面向对象的概念和利用已超过了程序设计和软件开发,扩大到如数据库系统、交互式界面、利用构造、利用平台、分布式系统、网络管理构造、CAD 技术、人工智能等畛域。面向对象是一种对事实世界了解和形象的办法,是计算机编程技术倒退到肯定阶段后的产物。面向对象是绝对于面向过程来讲的,面向对象办法,把相干的数据和办法组织为一个整体来对待,从更高的档次来进行零碎建模,更贴近事物的天然运行模式。
网上有一个活泼的例子来阐明面向对象的特点:
我要用洗衣机洗衣服,只须要按一下开关和洗涤模式就能够了。有必要理解洗衣机内 部的构造吗?有必要碰电动机吗?有必要理解如何通电的吗?
这是一个很“实在”的例子,没有人会为了应用洗衣机去学一下电学的组成原理,但咱们却不便使用者洗衣机,手机,电脑等各种各样的事物却并不理解它们的原理。这是坏事还是好事?洗衣机能够洗脏衣服,手机能够和亲朋好友打电话,电脑能够帮忙咱们不便的解决难以解决的各种问题。但这个世界上并不是没有人不懂洗衣机的原理,手机的制作,电脑的组装。咱们不懂其内部结构却失常的应用着这些设施,并不是单纯科技的提高,而是人类对于事物的解决思路产生了变动,究其基本是为了更高的效率!设计手机的人兴许用着他人制作的洗衣机,敲着键盘的人是另一个畛域的创造者,社会分工明确,整体效率极大晋升,你只需专一一项,就可取得所有的便当。
回到面向对象的问题上来,什么是面向对象呢?
集体认为:如果摒弃软件开发的领域,这是一种通过明确社会分工而提高效率的办法。在软件开发的范畴内,就是通过形象出零碎性能而实现最大化代码复用的开发模式。
面向对象的延长:
面向对象是软件开发的名词,但其中蕴含的是这个世界的倒退法则。
比方,住房子不肯定本人建,也能够买;吃饭不肯定本人做,也能够进来吃或者叫外卖;至于洗衣机,电脑冰箱这些更不必提了。你只须要做好本人的事,剩下的,交给其他人就好了。
在软件开发的领域内,除了编写代码上使用了面向对象的思维,应用第三方框架等同样是面向对象的延长,从底层的操作系统,JVM 虚拟机,包含 Java 语言,咱们并不需要从新再创造一遍,站在伟人的肩膀上,咱们能做的事更多。
2,如何实现面向对象?——封装,继承,多态
2.1 封装
- 什么是封装?
外围:通过暗藏实现,裸露接口,一来实现代码解耦,二来通过拜访修饰符保障数据安全。
- 如何保障数据安全
比如说设置年龄,能够在 set 中加个 if 强制不能超过 30 岁。(同理,不能为空等等能够保障数据安全)
public void setAge(int age) {
if(age>=30){
this.age=18;
}else{
this.age = age;
}
}
参考这位女司机豪横:https://zhuanlan.zhihu.com/p/37853346
2.2 继承
外围目标:实现代码复用。
-
继承规定
- 子类具备父类非 private 的属性和办法
- 子类能够扩大本人的属性和办法
-
结构器会被继承吗?
- 结构器是不会被子类继承的,但子类的对象在初始化时会默认调用父类的无参结构器。
子类会继承父类的数据,所以必须要看父类是如何对数据进行初始化的;故子类在进行对象初始化时,会先调用父类的构造函数。
- 结构器是不会被子类继承的,但子类的对象在初始化时会默认调用父类的无参结构器。
- 当父类显式写了有参结构器,且没有无参结构器。子类继承父类的时候必须 显式的调用父类的有参结构器。调用的形式能够应用 super(a,b)来调用。
- 子类,父类初始化程序
准则:动态优于非动态,父类优于子类
– 父类动态变量,动态语句块
– 子类动态变量,动态语句块
– 父类非动态代码块,结构器
– 子类非动态代码块,结构器class Base {
// 1. 父类动态代码块
static {
System.out.println(“Base static block!”);
}
// 3. 父类非动态代码块
{
System.out.println(“Base block”);
}
// 4. 父类结构器
public Base() {
System.out.println(“Base constructor!”);
}
}
public class Derived extends Base {
// 2. 子类动态代码块
static{
System.out.println(“Derived static block!”);
}
// 5. 子类非动态代码块
{
System.out.println(“Derived block!”);
}
// 6. 子类结构器
public Derived() {
System.out.println(“Derived constructor!”);
}
public static void main(String[] args) {
new Derived();
}
}Base static block!
Derived static block!
Base block
Base constructor!
Derived block!
Derived constructor! -
继承之父——Object 类
Object 类是所有 Java 类的根父类,如果在类的申明中未应用 extends 关键字指明其父类,则默认父类 为 java.lang.Object 类(任何类都能够调用 Object 的办法)
【Object 的次要组成】
- public native int hashCode(); 获得 hash 码
hash 码是依据肯定的规定将与对象相干的信息(比方对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。次要作用是为了配合基于散列的汇合一起失常运行,这样的散列汇合包含 HashSet、HashMap 以及 HashTable。
当汇合要增加新的对象时,先调用这个对象的 hashCode 办法,失去对应的 hashcode 值,如果 table 中没有该 hashcode 值,它就能够间接存进去,不必再进行任何比拟了;如果存在该 hashcode 值,就调用它的 equals 办法与新元素进行比拟,雷同的话就不存了,不雷同就散列其它的地址。
- equals(Object obj)比拟对象
- clone()可用于简单对象的深拷贝
- public native int hashCode(); 获得 hash 码
2.3 多态
- 什么是多态?
一类事物的多种体现状态。(比方手机有各种各样的品牌,但都属于手机这一类事物)
- 多态的体现形式:重载,重写
办法重载:同一个类中,办法名雷同,参数或者参数的个数不同
办法重写:类产生了继承关系,子类重写父类办法(办法名,参数,返回类型必须与父类统一)
- 向上转型
将子类对象转化为父类对象,目标:调用父类的公共办法
规定:能够拜访父类独有的办法和子类重写父类的办法,无法访问子类扩大的办法
[如果有 100 个类继承了同一个父类,父类的办法能够被这 100 个类应用,相比于在子类中一一定义,在父类中定义具备更好的代码复用性]
Father 是父类,Son 类继承自 Father。
Father f1 = new Son(); //(向上转型)
Son s1 = (Son)f1; //(向下转型,父类转换为子类) - 向下转型
将父类对象转换为子类对象,目标:调用子类独有的办法(为什么不间接 new 一个子类对象???)
规定:能够调用父类的办法,子类重写父类的办法,子类扩大的办法
Father 是父类,Son 类继承自 Father。
Father f1 = new Son();
Son s1 = (Son)f1; //(向下转型,父类转换为子类,注:父类对象无奈间接转换为子类对象,向下转型前必须先向上转型)
3,关键字盘点
3.1 static
static 能够润饰办法,变量,代码块,类,前两种利用更加常见。
-
static 润饰办法
static 润饰的办法称为 静态方法 ,也称 类办法,能够间接通过类名. 办法名间接拜访,不须要实例化对象拜访。
规定:
- 非 static 办法能够拜访 static 办法.
- static 办法不能拜访非 static 办法
- static 润饰变量
static 润饰的变量称为 动态变量 ,也称 类变量 , 全局变量,能够间接通过类名. 变量名间接拜访,不须要实例化对象拜访。
- static 的继承问题
子类是不会继承父类被 static 润饰的办法和变量,然而能够调用。
-
static 润饰代码块
代码块的作用:对类或对象进行初始化。
动态代码块【static 润饰】
- 不能够对非动态的属性初始化。即:不能够调用非动态的属性和办法。
- 动态代码块的执行要先于非动态代码块。
- 动态代码块随着类的加载而加载,且只执行一次
非动态代码块
- 除了调用非动态的构造外,还能够调用动态的变量或办法。- 每次创建对象的时候,都会执行一次。且先于结构器执行。
3.2 final
final 关键字能够润饰类,办法,变量。
- final 润饰类
不能被继承
- final 润饰办法
办法不能被子类重写
- final 润饰变量
润饰根本数据类型的变量,想当于定义了一个常量。
final int x =5;
x=6;// 报错润饰援用类型的变量,固定栈,不固定堆,也就是援用变量的地址是不可变的,然而援用地址指向的堆中的内容是可变的。
final StringBuffer s = new StringBuffer(“hello”);
s.append(“world”);