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

本篇博客次要记录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变量到底占用多大的内存呢?网上的各种说法都有?欢送大家留言探讨。

公众号举荐

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理