关于java:你必须知道的Java基础知识

5次阅读

共计 5250 个字符,预计需要花费 14 分钟才能阅读完成。

本篇博客次要记录 Java 中面向对象的概念和 Java 语法的基础知识。

面向对象

什么是面向对象

面向对象是一种优良的软件设计思维,是绝对于 面向过程、面向切面 等设计思维的一种软件设计理念。它的核心思想是使用更加贴近人类思维的形式去设计软件,将软件中的各个组件形象成相应的类,再将这些类组装成咱们所需的软件系统。

这里举个例子:如果用面向对象的形式设计一个电脑,咱们会设计 CPU 类、硬盘类、显示器类、内存类等等,而后将这些类组合在一起设计成 Computer 类。

而面向过程的思维在解决问题时会将问题分解成一个个小的函数,而后依照某种程序去执行这些办法,当这些办法执行结束,问题也就解决了。

三大基本特征和五项根本准则

面向对象的三大基本特征是:封装、继承和多态 。正是基于这些特色,面向对象的开发语言能力领有更好的 可重用性、扩展性和维护性

  • 封装:将对象的实现细节暗藏起来,而后通过一些公共的办法向内部提供该对象的性能;
  • 继承:继承是软件复用的一种重要伎俩,子类继承父类之后将间接取得父类的属性和办法;
  • 多态:对象能够赋给父类对象或者它实现的接口,然而运行时仍然体现出子类或实现类的特色。

面向对象的五大准则如下:

  • 繁多职责准则(SRP):一个类专一于实现一个性能;
  • 开闭准则(OCP):对象或实体应该对扩大凋谢,对批改关闭;
  • 里氏替换准则(LSP):子类能够替换父类并且呈现在父类可能呈现的任何中央(这个准则就须要咱们面向接口编程);
  • 依赖倒置准则(DIP):高层次的模块不应该依赖于低层次的模块,他们都应该依赖于形象,形象不应该依赖于具体实现,具体实现应该依赖于形象;
  • 接口隔离准则(ISP):应用多个专门的接口比应用单个接口要好的多:在理论编程中,为了缩小接口的定义,将许多办法都放在一个接口中,最初发现,保护和实现接口的时候会破费很多精力,接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越简练越好,过多的承诺带来的就是你的大量精力和工夫去保护。不要把不相干的办法放在一个接口中定义。

另外还有 迪米特准则 合成服用准则,也须要咱们在设计零碎和接口时思考到。

迪米特法令 :又叫起码常识法令,这个法令主张一个类要尽可能少地晓得其余类地细节,并且尽可能少地和其余类进行通信交互,只和于本人有密切关系地类进行交互。
合成服用准则 :合成服用准则又称为组合 / 聚合服用准则(Composite/Aggregate Reuse Principle):尽量采纳组合(contains-a)、聚合(has-a) 的形式而不是继承 (is-a) 的关系来达到软件的复用目标。

合成服用准则最次要地起因是 继承会破环封装:基类的很多外部细节都是对派生类可见的,而有些细节可能是不想让子类晓得的。对于继承、组合还有聚合的概念可能比拟容易搞混,这边也提下。

继承:子类领有父类的某些属性和办法,子类能够替换父类;
组合:是整体与局部的关系,整体离不开局部,局部来到了整体没有意义,如飞机翅膀与飞机的关系;
聚合:也是整体与局部的关系,但整体能够拆散局部,局部也能够来到整体,如火车与车厢的关系,还有就是聚合领取的列子等。

重载和重写的区别

重载:是指在一个类外面存在多个办法名雷同,然而办法参数不同的办法。

重写:是指子类在继承父类时,从新改写了父类的某个办法。子类中的这个办法的办法名和办法参数和父类中的齐全一样。

Java 根底语法

Java 语言是最风行的编程语言,从刚“出世”,Java 语言就号称“一次编译,到处运行”。

Java 语言能跨平台的要害是 JVM 能跨平台,JVM 屏蔽了操作系统的底层差别,让字节码文件在每个平台上都能够执行。

除了 Java,JVM 还反对的语言有 Kotlin、Groovy、JRuby、Jython、Scala 等。另外,随着 Oracle 对 Graal 虚拟机的研发,JVM 平台将会反对所有的语言,包含 JS 和 C ++ 等语言。

进行 Java 开发的第一步是下载一个适合版本的 JDK,而后配置 JAVA_HOME 这个环境变量。然而如果你只是须要运行 Java 程序,那你只须要装置一个 JRE 即可。JDK 和 JRE 的关系如下:

JDK 蕴含:Java 编译器、JRE 以及罕用的 Java 类库;
JRE 蕴含:JVM、类加载器、字节码校验器以及外围类库等。

而后就是编译执行 Java 程序

# - d 前面的参数指定生成的字节码文件的生产门路,默认当前目录;javac -d destDir HelloWorld.java;# 执行 Java 程序;# classpath 的作用是提供了一系列门路让 Java 程序去在这些门路下寻找类,找不到就报错。在 Windows 上用; 号宰割,在 Linux 上用: 号分隔
java -classpath %CLAss_PATH%;.;dir1;dir2 HelloWorld;

三种根本的程序结构

  • 程序构造
  • 抉择构造
  • 循环构造

应用这三种构造能编写出任意性能的程序。

Java 中的正文

  • 单行正文://
  • 多行正文:/**/
  • 文档正文:/* / 应用 javadoc 能够生成 api 文档

Java 中的关键字

Java 中一共有 48 个关键字,2 个保留字和三个间接量

  • 访问控制:private、protected、public;
  • 类, 办法和变量修饰符:abstract、class、extends、final、implements、interface、native、new、static、strictfp、synchronized、transient、volatile;
  • 程序控制:break、continue、return、do、while、if、else、for、instanceof、switch、case、default;
  • 错误处理:try、cathc、throw、throws、finally;
  • 包相干:import、package;
  • 根本类型:boolean、byte、char、double、float、int、long、short、null、true、false;
  • 变量援用:super、this、void;
  • 保留字:goto、const;
  • 间接量:true、false、null。

重要关键字阐明:

  • native:用来申明一个办法是由与机器相干的语言 (如 C /C++/FORTRAN 语言) 实现的;
  • strictfp:用来申明 FP-strict(双精度或单精度浮点数)表达式;
  • transient:申明不必序列化的属性;
  • volatile:表明两个或多个变量必须同步地发生变化。

数据类型

Java 中的数据类型分为根本数据类型和援用数据类型。

1. 取值范畴

8 种根本数字类型从大类上分的话别离是布尔型,字符型,整形和浮点型,对应 bool,byte,char,short,int,long,float 和 double 类型。

  • byte:一个字节,8 个 bit 位,-2^7 ~ 2^7-1
  • char : 2 个字节,16 个 bit 位,0 ~ 2^16-1 ;
  • short:2 个字节,16 个 bit 位,-2^15 ~ 2^15-1
  • int:4 个字节,32 个 bit 位,-2^31 ~ 2^31-1
  • long:8 个字节,64 个 bit 位,-2^63 ~ 2^63-1
  • float:4 个字节,32 个 bit 位
  • double:8 个字节,64 个 bit 位。

下面的 float 和 double 都是浮点类型数据,在计算机中,浮点数用来近似示意任意某个实数。浮点数分为双精度浮点数和单精度浮点数。单精度占 4 个字节,双精度占 8 个字节,示意的范畴更大。

对于 double 和 float 类型的数据,负数除以 0 失去正无穷,正数除以 0 失去负无穷,0.0 除以 0 达到 NaN。然而整数除以 0 会失去除 0 异样。

在要求准确计算的场合,不倡议应用浮点型数据。因为浮点数计算的后果不是很准确,是近似的后果。这种状况应该应用 BigDecimal。这边举个 BigDecimal 应用的简略列子:

BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(1.1));
BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(2.223));
String str1 = bigDecimal1.add(bigDecimal2).toString();
// 减法
bigDecimal1 = new BigDecimal(String.valueOf(2.2));
bigDecimal2 = new BigDecimal(String.valueOf(10.1));
String str2 = bigDecimal1.subtract(bigDecimal2).toString();
// 乘法
bigDecimal1 = new BigDecimal(String.valueOf(1.1));
bigDecimal2 = new BigDecimal(String.valueOf(2.234));
String str3 = bigDecimal1.multiply(bigDecimal2).toString();
// 除法
bigDecimal1 = new BigDecimal(String.valueOf(4.4));
bigDecimal2 = new BigDecimal(String.valueOf(3));
// 除法须要设置精度和四舍五入的形式
String str4 = bigDecimal1.divide(bigDecimal2,3, RoundingMode.HALF_UP).toString();
// 后果
System.out.println("加法后果:" + Double.valueOf(str1));
System.out.println("减法后果:" + Double.valueOf(str2));
System.out.println("乘法后果:" + Double.valueOf(str3));
System.out.println("除法后果:" + Double.valueOf(str4));

2. 根本数据类型之间的转换

char—————|
byte–>short–>int–>long–>float–>double

对于下面的转换关系做下阐明:char 能够主动转换成 int,byte 能够主动转换成 short,short 能够主动转换成 int。这些转换过程都是主动实现的。

short a = 3;
int b = a;

那么将 int 赋值给 short,或者将 double 赋值给 int 可不可以呢?答案是能够的,然而最初的数据可能不是咱们预期的值。因为 int 占的字节数比 short 长,short 盛放不下,会做数据截取。

  • 整数之间的强制转换:比方 int 转换为 short 会缩短位数;
  • double 向 int 转换:会截掉小数局部。

3. 表达式类型主动晋升

整个表达式的类型会晋升为表达式中最高等级的类型。

short aa = 1;
// 这个表达式会报错,aa+ 2 会主动晋升为 int
short bb = aa+2; 

包装类类型

包装类型是绝对于根本数据类型来讲的。Java 中有 8 种根本数据类型,每个根本数据类型都有绝对的包装类型。比方 int 的包装类型是 Integer。包装类型都是是援用类型,而且都是不可变类。

对于包装类型,有两个概念须要咱们理解:

  • 主动装箱:将根本数据类型赋值给包装类型的过程,实现原理是编译器层面 new 了一个包装类再赋值给相应的变量(如果是是将包装类缓存过的数值赋值给包装类的化,不会 new 新的包装了,而是间接应用缓存的对象);
  • 主动拆箱:包装类型间接赋值给根本数据类型,实现原理相似,也是编译器层面调用了包装类的 getValue 办法再赋值给对应的根本数值类型。

比拟乏味的是,包装类型在加载的过程中都会缓存某些值的类。比方 Integer 会缓存 -128 到 127 的类。

// 不会应用缓存的数据
Integer num1 = new Integer(1); 
// 会应用缓存的数据, 实际上是调用了 Integer.valueOf 办法
Integer num2 = 1;

通过设置 -XX:AutoBoxCacheMax=? 这个参数,能够调整 Integer 缓存的最大值。当然其余包装类型也有相似的行为,Byte、Short 和 Long 都缓存了 -128 到 127 的类,Character 缓存了 0 到 127 的类,然而这些类不能像 Integer 那样批改缓存的最大值。

对于根本数据类型和包装类型的应用,介绍一个阿里巴巴开发标准中的准则:

所有的 POJO 类属性必须应用包装数据类型;RPC 办法的返回值和参数必须应用包装类型;所有的局部变量尽量应用根本数据类型。
定义布尔型的类变量,变量名不要以 is 打头。

Java 中的值传递和援用传递

根本数据类型,保留的是数据自身的值,按值传递;援用类型的变量保留的是对象在内存中的地址,按援用传递(援用传递能够看成是一种非凡的值传递)。

一个问题

Java 中的 bool 变量到底占用多大的内存呢?网上的各种说法都有?欢送大家留言探讨。

公众号举荐

欢送大家关注我的微信公众号「程序员自在之路」

正文完
 0