java -jar 默认参数_JAVA入门学习指南,建议收藏

0fc2d08ca1e98ef81c20d456e1332716.gif

如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 。 

让我们出发吧!ps:本文有点长,耐心阅读 。

〇,编程环境

工程项目推荐使用IDEA.

入门学习推荐使用jupyter notebook.

安装jupyter notebook的java插件 IJava 的方法如下:

1,下载Java JDK >= 9.建议12

2,下载ijava-1.3.0.zip,并解压。

3,进入解压后目录,运行 python3 install.py --sys-prefix。

详情参见:https://github.com/SpencerPark/IJava

也可以在以下网页链接中直接尝试IJava:

https://mybinder.org/v2/gh/SpencerPark/ijava-binder/master

d0f9806de8d92e8048c922c3d5ed69fb.png

一,算数运算

f091538f12099c29251bd418a8e3ae9a.png

64c24893e4f6d1b45bcf2d214050eabd.png

c45538ad5e1a7b61de2d498a21b40ee8.png

二,输入输出

输入:System.in, java.io.InputStreamReader, java.util.Scanner

输出:System.out.println,  System.out.printf,  System.out.print

读文件:java.io.FileInputStream

写文件:java.io.FileOutputStream

1,输入

Scanner扫描输入,遇到\n结束。

BufferedReader.read() 逐字符读取。

BufferedReader.readLine() 逐行读取。

e27264a6ada87872919a3176a7f2f4e2.png

04e9f2bc83810496c95d2fe4915daca7.png

93f3f2837223c68628f3a11f00986298.png

2,输出

print不换行,println换行,printf格式化输出。

0f76825b6e8c914694c3ed5d353a3eb9.png

3,读文件

d898acda878abaeca67e74e16f4041f5.png

4,写文件

e2b0b7bfb8d68bd0cf4821c1a414112e.png

三,导入Package

java有以下一些导入包的方式:

1,导入包中某个对象:import java.text.SimpleDateFormat

2,导入包中全部对象: import java.util.*

3,导入包中的静态字段和方法(较少使用): import static java.lang.System.*

4,默认导入: java默认导入了java.lang.* 

46eb0186952f709e90852b1f33d9fa51.png

149bd9638497929ed1b8f12663f3c187.png

19860642471cd0ef1ecbe807d62202a8.png

四,语法规则

1,标识符

标识符由字母和数字组成,遵循驼峰命名规则。

类的名称以大写字母开头。

方法的名称以小写字母开头。

变量的名称以小写字母开头。

80fc4fc9318f683ba1c5858e3f6fc62c.png

2,注释

单行注释用//开头。

多行注释用/*开头,以*/结尾。

特殊多行注释,以/**开头,以*/结束,如果有多行,每行通常以星号开头。

这种特殊的多行注释需要写在类和方法的定义处,可以用于自动创建文档。

f3bbe6f791a823b8935d326df5697fbc.png

c355accaa819fc9cdcb2c9e3550ccc44.png

3,数据类型

Java 的数据类型有两大类,基本数据类型和引用数据类型。

基本数据类型相对非常底层,基本类型相同值的对象占有同样的存储单元,判断是否相等可以用 ==。

引用数据类型本质上都是Class,相对抽象,引用类型相同值的对象占用不同的存储单元,判断是否相等应该用 equals方法。

基本数据类型包括:整型(byte,short,int,long),浮点型(float,double),布尔类型(boolean),字符类型(char)

引用数据类型包括:包装类型(Integer,Double,Char,Boolean,……),字符串(String),数组(Array),以及各种容器类(List,Map,Set,Queue)。

用户自定义的任何Class都可以看成是一种引用数据类型。

0f5efd3da93f5331e19d0fbd188c59e4.png

d87d71eb8aa819506e6ff1fd97df46c6.png

aeaffb1bfeefd9bca9025a378fdb5181.png

6b62c251b077381c070459243c530f65.png

60b825d76338b446e3f0cbea4ecdc0a1.png

4,变量声明

9061ff3ad1ddd388aa10aedd6af60d99.png

097100210b4f697ff8af7d76df541902.png

5,标点符号

Java 中常用的标点符号用法总结如下

  • ()表示优先级或者函数参数列表

  • []用于索引或数组声明

  • {}用于作用域

  • <>用于泛型

  • * 用于import包时的通配符

  • @用于注解

五,编译执行

1,程序结构

一个.java程序文件中必须有且只有一个public类,该类必须有一个声明为main函数作为程序入口。

并且这个main函数需要声明为 public static void 类型,即静态的,公开的,返回值为空的函数类型。

并且这个java程序的文件名必须和这个public类名保持一致。

787d6400aba3e65f1e4313b157c54078.png

将以上代码拷贝到文本文件中,命名为 Main.java。

2,编译执行

Java是一种解释型语言,其java源码需要被编译成class字节码运行在Java虚拟机上。

因此,执行Java程序分两步:

(1),使用javac编译命令将以.java结束的程序文件编译成以class结尾的字节码程序文件。

javac Main.java 编译后得到 Main.class文件

(2),使用java 命令运行字节码程序。

java -classpath ./ Main 在JVM上执行Main.class文件

1eac576d833087d9be37222359020984.png

编译时,按下面的顺序依次查找类:

(1)查找当前package是否存在这个class;

(2)查找import的包是否包含这个class;

(3)查找java.lang包是否包含这个class。

如果按照上面的规则还无法确定类名,则编译报错。

3,classpath和jar包

(1) classpath 

classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class。

它其实就是一组目录的集合,它设置的搜索路径与操作系统相关。

例如,在Windows系统上,用;分隔,可能长这样。

C:\work\project1\bin;C:\shared;"D:\My Documents\project1\bin"

在Linux系统上,用:分隔,可能长这样。

/usr/shared:/usr/local/bin:/home/liaoxuefeng/bin

如果JVM在某个路径下找到了对应的class文件,就不再往后继续搜索。如果所有路径下都没有找到,就报错。

classpath的设定方法有两种:

在系统环境变量中设置classpath环境变量,不推荐;

在启动JVM时设置classpath变量,推荐。

我们强烈不推荐在系统环境变量中设置classpath,那样会污染整个系统环境。在启动JVM时设置classpath才是推荐的做法。实际上就是给java命令传入-classpath或-cp参数:

java -classpath .;C:\work\project1\bin;C:\shared abc.xyz.Hello

但通常classpath这个参数不需要配置,其默认值为当前目录 ./一般就够用了。

(2) jar包

设想一下,如果有很多.class文件,散落在各层目录中,肯定不便于管理。

如果能把目录打一个包,变成一个文件,就方便多了。

jar包就是用来干这个事的,它可以把package组织的目录层级,以及各个目录下的所有文件(包括.class文件和其他文件)都打成一个jar文件,这样一来,无论是备份,还是发给客户,就简单多了。

jar包实际上就是一个zip格式的压缩文件,而jar包相当于目录。如果我们要执行一个jar包的class,就可以把jar包放到classpath中:

java -cp ./hello.jar abc.xyz.Hello

jar包还可以包含一个特殊的/META-INF/MANIFEST.MF文件,MANIFEST.MF是纯文本,可以指定Main-Class和其它信息。JVM会自动读取这个MANIFEST.MF文件。如果存在Main-Class,我们就不必在命令行指定启动的类名,而是用更方便的命令:

java -jar hello.jar

jar包还可以包含其它jar包,这个时候,就需要在MANIFEST.MF文件里配置classpath了

4,maven项目管理工具

实际项目开发中,通常使用maven管理项目,并打成jar包。

maven使用POM文件POM.xml指定项目的依赖和打包方式。

maven安装后,将会在本地创建~/.m2/repository目录,集中存放jar包作为本地仓库。

maven搜索并载入依赖的顺序如下:本地仓库->私人远程仓库->中央仓库

常见的maven 命令如下:

  • mvn clean          清理编译打包输出

  • mvn compile      项目编译

  • mvn package     项目打包

  • mvn install          安装到本地仓库

六,Java数据结构概述

Java中常用的数据结构主要包括字符串(String),数组(Array),枚举(enum), 以及java.util中的各种容器类(通常被称做集合)。

java.util中的这些容器类分成两大类,一类是实现了Collection接口,另外一类实现了Map接口。

容器类中常用的数据结构包括:列表(List),映射(Map),集合(Set),队列(Quene),堆栈(Stack)。

当然这些数据结构也都是接口,通过API封装了特定的功能,下面还会有多种不同的实现。

可以用统一的Iterator方式对大多数容器类进行遍历,这种更加抽象的方式优于使用下标的方式进行遍历。

9ff0c978c1d34da70a93356a9eb060af.png

七,字符串String

Java 中的字符串和Scala中的字符串来源于同一个包,java.lang.String,两者具有完全相同的方法。

以下为字符串一些常用操作。

5e04b12143010313eee593412d062cfb.png

f600cf0fa2e2ba736c05ece2bd3ec78f.png

八,数组Array

Java 中的数组和 C++中的数组很像,其长度是不可变的,但是数组中的元素内容是可以改变的。

数组是引用类型,一般是用花括号{}作为数组范围标识。

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

1,创建Array

4fa7efa51a251b58fba794232abe550b.png

be4deb6897a080c8f35d0053f0c78731.png

2,Array的常用操作

6b0580d457dc7f38c2ce7713d55c81d0.png

6e77e2dbb9456b7fe0f091318dc685d7.png

九,列表List

Java中的列表List是一种有序数据结构的接口。

它有两种实现,一种是ArrayList,另外一种是LinkedList。前者是顺序存储,方便查询和修改特定元素。后者是链表存储,方便插入和删除元素。通常情况下我们使用ArrayList更多一些。

和数组Array不同,List的大小是可以改变的。

List的主要方法如下:(E是元素 e的类型)

  • 在末尾添加一个元素:void add(E e)

  • 在指定索引添加一个元素:void add(int index, E e)

  • 删除指定索引的元素:int remove(int index)

  • 删除某个元素:int remove(Object e)

  • 获取指定索引的元素:E get(int index)

  • 获取列表大小(包含元素的个数):int size()

1,创建List

1a967ccbd06abe9dcd78fbf625d98bbb.png

2,List常用操作

7c47c6800112a32343fa4ca68ef9e3ef.png

8594e14c0525ef9d13226b0d2442dea8.png

b9139322f4a5f95d5bfc0034d2886cd1.png

十,映射Map

Map是一种无序数据结构的接口,存储键值对(key,value)。

Map的常用实现是HashMap, LinkedHashMap, TreeMap。其中TreeMap是一种有序的Map.

Map的常用方法是put和get。如果想查询某个key是否存在,可以调用containsKey.

Map中的key是唯一的,作为key的对象必须实现equals和hashCode方法。使用TreeMap时,放入的Key必须实现Comparable接口。

Map通常用来高效地进行查找。

1,创建Map

20fef6fc33c0ea4629ff6ef7343be861.png

1b4cf20133edbc602c51e7beb44905fd.png

2,Map常用操作

087fc2ea3b64338563bd90ab631cefc5.png

124fd42883d416e54f836215ae0cce5f.png

43adc6488ef52a065139cb5a08e86fed.png

十一,集合Set

Set用于存储不重复的元素集合,它主要提供以下几个方法:

  • 将元素添加进Set:boolean add(E e)

  • 将元素从Set删除:boolean remove(Object e)  

  • 判断是否包含元素:boolean contains(Object e)

6020f382140279a8fd6f6e4a11c27123.png

十二,迭代器

Java的容器类都可以使用for each循环,List、Set和Queue会迭代每个元素,Map会迭代每个key。

下面以List和Set的for each遍历为例。

a56354b197a6487878f8f5b15777d3f5.png

实际上,Java编译器并不知道如何遍历List和Set。

上述代码能够编译通过,只是因为编译器把for each循环通过Iterator改写为了普通的for循环:

13213e900fe9aaf72d5ccdd8723d469b.png

Iterator是一种抽象的数据访问模型。使用Iterator模式进行迭代的好处有:

  • 对任何容器都采用同一种访问模型;

  • 调用者对容器内部结构一无所知;

  • 容器类返回的Iterator对象知道如何迭代。

如果我们自己编写了一个容器类,想要使用for each循环,则该容器类要实现Iterable接口,并返回一个Iterator对象,下面是一个范例。

2ab9b62a464d7689b706d425a712ea88.png

a0f87a585afc8a239e25a45a37a28ce8.png

十三,枚举类enum

如果有一些相关的常量,如星期,月份,颜色,可以将其它们定义为枚举类型。

枚举类型常用的方法有name和ordinal。

  • name():查看枚举常量值的名字。

  • ordinal():查看枚举常量值的序号。

834f5f0e69f05f163c3face4bd50baa2.png

通过enum定义的枚举类,其实也是一个class,只不过它有以下几个特点:

  • 定义的enum类型总是继承自java.lang.Enum,且无法被继承;

  • 只能定义出enum的实例,而无法通过new操作符创建enum的实例;

  • 定义的每个实例都是引用类型的唯一实例;

  • 可以将enum类型用于switch语句。

因为枚举类也是class, 所以我们可以定义private的构造方法,并且,给每个枚举常量添加字段。

b1ea559c973c35357017470f01aecd51.png

十四,选择结构

Java的选择结构主要有 if 语句和 switch语句。switch语句是多分支结构。

1,if 选择语句

980ab023a4fcbd5c500052ef86407c3a.png

2,switch多分支结构

使用switch时不要忘记break,不要忘记default。

ac253d7bcbd978cd77a62542c4b1e783.png

十五,循环结构

Java中的循环结构包括for循环,for each循环,while循环。

1,for循环

04f529819ad2eeffc47a49070ee21f37.png

2,for each循环

for each循环可以对数组,字符串,各种容器类型进行遍历,其背后依赖于Iteratable接口。

e7c4961cca280c294f9eb40c89baefa5.png

3,while循环

9ed9719799afd8bc136d45b015f9296c.png

4,流程控制continue、break

f4485505a530da84deb4a8823c973eaf.png

十六,异常处理

Java中的异常包括两种体系:Error和Exception.

Error指的是严重的错误,程序一般对此无能为力。如:

  • OutOfMemoryError:内存耗尽

  • NoClassDefFoundError:无法加载某个Class

  • StackOverflowError:栈溢出

而Exception则是运行时的错误,它可以被捕获并处理。

某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:

  • NumberFormatException:数值类型的格式错误

  • FileNotFoundException:未找到文件

  • SocketException:读取网络失败

还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:

  • NullPointerException:对某个null的对象调用方法或字段

  • IndexOutOfBoundsException:数组索引越界

Exception又分为两大类:

  • RuntimeException以及它的子类;

  • 非RuntimeException(包括IOException、ReflectiveOperationException等等)

Java规定:

  • 必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。

  • 不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

异常捕获的语句是 try...catch...finally...此外还可以用throw抛出异常

如:throw new IllegalArgumentException。

6afd1cd6a18aacadd562374d75a7607e.png

十七,类的定义

Java中用关键字class定义普通类, 用enum定义枚举类,用abstract class定义抽象类,用interface定义接口。

我们先看普通类的定义和实例化。

类的定义中可以用public声明为公有属性和公有方法,在类的内部和外部都可以被访问。

可以用private声明为私有属性和私有方法,只允许在类的作用域访问,不允许在类的外部访问。

可以用protected声明为受保护的属性和方法,只允许在类作用域及其子类作用域中访问。

不使用作用域关键字声明的属性和方法默认为为package作用域,在同一个package中的类可以访问。

fc0236aaeb0a4162d6c322632a8d0cdb.png

8d2048cf5db86ff412df85769d639793.png

c60277efc1bbd57499a2b4837372c89b.png

十八,构造方法

构造方法是类的一个特殊的方法,构造方法名就是类名。

构造方法没有return返回值,也没有void声明。

如果一个类没有定义任何构造方法,那么编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句。

如果我们已经定义了构造方法,那么编译器不会生成默认构造方法。

没有在构造方法中初始化属性时,引用类型的字段默认是null,int类型默认值是0,布尔类型默认值是false。

我们可以为一个类定义多个构造方法,使用时可以根据参数类型和数量自动进行匹配。

这叫做构造方法的重载。

所有方法都支持方法重载。

2e1fa782dab2cbc7e8c378e3683601c7.png

bfcbc7be91f7a6cc075a67e06b4bf665.png

十九,静态属性和静态方法

通过static修饰的属性为静态属性,通过static修饰的方法为静态方法。

静态属性和静态方法属于类而不属于特定的实例,在类的实例之间共享。

可以通过类名直接调用静态属性和静态方法,也可以通过实例对象间接调用。

静态方法中不能够通过this关键字使用实例属性。

09ba8ecc6b215ec07a629e3b54316047.png

073d1bb07349e324c393af93e0bc2a9f.png

二十,继承

类和类之间有三种关系:A is B, A use B, A has B.

其中A is B 就是 继承关系。如果A 的属性中有 B的类型,叫做 A has B.如果A 的方法的参数中有 B的类型,叫做 A use B.

我们重点介绍继承关系。

在Java中使用extends声明继承关系。public, protected声明的属性和方法可以被子类继承,而private声明的属性和方法不可以被子类继承。

24af557b37526b9dde6a052323114260.png

e4d16b9ced77334d1984fc85a21fbf35.png

二十一,多态

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

这个非常重要的特性在面向对象编程中称之为多态。它的英文拼写非常复杂:Polymorphic。

多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。

这就实现了面向对象编程非常著名的开闭原则:对扩展开放,对修改封闭。

58d20ad7ac8305c6860ec1f75a8aa2d8.png

e1d6d6da58ce32984e1d55968cab878a.png

052f1bb3b629511e99211d887db1b79b.png

二十二,抽象类

使用abstract声明的方法为抽象类,抽象类只能够被继承,不能够创建抽象类的实例。

抽象类的方法可以被abstract声明为抽象方法,抽象方法没有执行语句。

抽象类的作用在于定义签名规范,具体的业务实现留给子类去做。

c2ba4a7affa438a79b24226497e0baec.png

二十三,接口

在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力。

如果一个抽象类没有字段,所有方法全部都是抽象方法,那么该抽象类就可以被改写成接口(interface)。

Java 中的 interface具有和 Scala中的 trait相似的功能。

一个class只能继承自一个父类,但可以继承自多个接口。

通过关键字 implements 声明class和interface之间的继承关系。

interface和interface之间也可以相互继承,使用关键字 extends来表示这种扩展关系。

interface不能有实例属性,但可以有静态属性。

interface中的所有方法都默认为抽象方法,因此无需关键字abstract声明。

interface的非抽象方法用default关键字声明,叫做default方法。

default方法中不能够引用实例属性,但可以调用抽象方法。

除了default方法和static声明的静态属性,interface基本上可以看成是一个躯壳。

9a2d96c8c6c10365aced8ca388e13e05.png

6485a8f88081e89115fb270cb906128f.png

c7fd23176efb6a5197fb4a6691457ced.png

二十四,反射

通常我们通过类来创建实例,但反射机制让我们能够通过实例来获取类的信息。

包括类的名字,类的属性和方法签名,类的继承关系等等。

当加载进一个class类文件时,JVM会创建一个Class类型的实例来保存类的信息。

1,获取Class类型实例

d61571c7283bfc71a4cd70ee9568d6f9.png

2,访问属性

  • Field getField(name):根据字段名获取某个public的field(包括父类)

  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)

  • Field[] getFields():获取所有public的field(包括父类)

  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)

58034dd7f9e75a3b765431202f997610.png

99c79957c0d99909daa8146922577125.png

882c6f3d27254a56ea3ff807d78583d7.png

3,调用方法

  • Method getMethod(name, Class...):获取某个public的Method(包括父类)

  • Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)

  • Method[] getMethods():获取所有public的Method(包括父类)

  • Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)

9ce4489c9255fcc3c20a6bfe34f7447b.png

4,调用构造方法

eabd42098bbc37aecacfbb2cfe5f611e.png

5,获取继承关系

16ca0626c3c0559e90e7b53ced3a9b8b.png

31dff769a6bf0abebab6892e58654ef1.png

二十五,泛型

泛型就是编写模板代码来适应任意类型。Java的容器类中大量使用了泛型。

泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查。

Java中泛型的实现是使用的擦拭法,编译器编译包含泛型的类时将泛型换成Object类型,

编译器编译泛型实例化的代码时根据泛型的具体类型进行安全转型,而JVM虚拟机对泛型一无所知。

因此泛型的类型不能是int,float,double等基本类型,并且不能够获取泛型的反射。

ea8b7fd626c725c5dec3d4672bb11271.png

d35cc62368326505664fe204d5ac4dbc.png

二十六,注解

Java中的注解是放在Java源码的类、方法、属性、参数前的一种特殊"注释",以@开头。

注解可以看成用作标注的一种"元数据"。

Java中有3中不同的注解:

  • SOURCE类型的注解由编译器使用,在编译期被丢掉了,如@Override;

  • CLASS类型的注解仅保存在class文件中,这类注解只被一些底层库使用,它们不会被加载进JVM;

  • RUNTIME类型的注解会被加载进JVM,并且在运行期可以被程序读取。

Java语言使用@interface语法来定义注解(Annotation),定义注解一般需要用到元注解。

元注解(meta annotation)就是可以用来修饰其它注解的注解。

Java标准库已经定义了一些元注解,我们只需要使用元注解,通常不需要自己去编写元注解。

注解定义后也是一种class,所有的注解都继承自java.lang.annotation.Annotation,因此,读取注解,需要使用反射API。

RUNTIME类型的注解如何使用,完全由程序自己决定。

二十七,Scala和Java对比

Java发明于1995年,Scala发明于2003年。

Scala和Java都是JVM语言,两者的源码都将编译成.class字节码在JVM虚拟机上执行。

因此Scala和Java可以无缝混编。

Scala在Java基础上做了重大的改进,使其兼备静态语言和脚本语言的特色。

下面列举一些比较显著的差异。

1,Scala比Java更加简洁

Java 中打印用 System.out.println, 而Scala用 println,类似Python。

Java 许多地方语句中的分号”;“不能省略, 而Scala可以省略,类似Python。

Java 声明变量时,先声明类型,再声明变量名,而Scala则先变量名,必要时用冒号说明类型,类似Python。

Java 定义方法无需关键字,Scala 定义方法用关键字 def,可读性更强,类似Python. 

Scala支持for推导式,类似Python.

Scala 支持类型推断,Java 在后面的版本才增加了 var 关键字来支持类型推断。

Scala 支持隐式类型转换和隐式参数。

2,Scala比Java更加灵活

Java必须先编译后才能执行,Scala解释器可以直接运行Scala脚本。

Java编程风格统一为面向对象,Scala支持面向对象和函数式编程多种风格

Java中的多分支用switch, Scala使用match模式匹配实现多分支。

Java中的类支持静态属性和静态方法,Scala用伴生对象和伴生方法概念将静态属性和方法与实例属性和方法分离。

Java的循环中支持break和continue关键字,Scala的循环中不支持。

3,常用标点符号差异

Java中导入全部对象用星号作为通配符,Scala中用下划线作为通配符。

Java中用方括号来取索引,Scala中用圆括号来取索引。

Java中用尖括号来表示泛型,Scala中用方括号来表示泛型。

Java中的数组用花括号来表示,Scala中一般用工厂方法。

Java中可以用冒号来书写for each语句,Scala中用

二十八,Java和C++的对比

C++发明于1983年,而Java发明于1995年。

C++代码直接编译成机器码运行在裸机上,而Java代码编译成字节码运行在虚拟机上。

C++编译的最终结果是一个程序生成一个exe文件。Java编译结果是一个程序中有多少类就生成多少个与类名相同的class文件。

Java的语法大量借鉴了C++,但和C++相比,Java是一门纯面向对象的语言,风格更加简洁统一。

下面列举一些两者语法上的差异。

1,C++ 导入package使用 #include, 而 Java使用 import 关键字 。

2,C++ 支持指针直接操控内存,而 Java 抛弃了令人困惑的指针功能。

3,C++ 使用析构函数回收垃圾,Java自动回收(GC算法)。

4,C++ 支持直接多继承性,Java用接口来实现多继承性。

5,C++ 中可以在类的外部可以定义函数,而Java不允许在类和接口外面直接定义方法。

— 

41e37b75066e3a8ec34701d7a0dd8314.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RabbitMQ】 WorkQueues

消息分发 在【RabbitMQ】 HelloWorld中我们写了发送/接收消息的程序。这次我们将创建一个Work Queue用来在多个消费者之间分配耗时任务。 Work Queues&#xff08;又称为&#xff1a;Task Queues&#xff09;的主要思想是&#xff1a;尽可能的减少执行资源密集型任务时的等待时…

笑看职场什么程序员才抢手,什么样的程序员涨薪多?

​程序员&#xff0c;怎么才算合格&#xff0c;不好说吧&#xff1b;他就像销售一样&#xff0c;一名销售员&#xff0c;比如网络销售卖茶叶&#xff0c;他卖茶叶很厉害呀&#xff0c;可是你让他去销售房地产&#xff0c;就算他有点销售的基础&#xff0c;也要重新去学怎么销售…

Android画布Canvas裁剪clipRect,Kotlin

Android画布Canvas裁剪clipRect&#xff0c;Kotlin private fun mydraw() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.A…

调查|73%的公司正使用存在漏洞的超期服役设备

本文讲的是调查&#xff5c;73%的公司正使用存在漏洞的超期服役设备&#xff0c;一份新近的调查覆盖了北美350家机构的212000台思科设备。结果显示&#xff0c;73%的企业正在使用存在漏洞、超期服役的网络设备。该数字在上一年仅为60%。 Softchoice公司思科部门业务主管大卫魏格…

深度装机大师一键重装_笔记本怎么重装系统?笔记本自己如何重装系统?

如何给笔记本重装系统呢?笔记本系统使用时间长了难免会运行缓慢&#xff0c;我们第一反应就是重装系统笔记本了。但是很多小白用户们就惆怅了&#xff0c;不知道笔记本怎么重装系统&#xff0c;怎么进行重装系统笔记本呢?首先&#xff0c;笔记本电脑可以重置系统&#xff0c;…

XMLHttpRequest状态码及相关事件

1.创建一个XMLHttpRequest对象 2.对XMLHttpRequest对象进行事件的监听(定义监听事件的位置不影响 3.对XMLHttpRequest对象的状态码 状态 名称描述0Uninitialized初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置1Open open() 方法已调用&#xff0c;但是 send()…

人工智能时代号角已吹响 COMPUTEX如何凝聚AI这股力量?

当前谈到人工智能&#xff08;AI&#xff09;&#xff0c;或许大家最直接的反应是Google的AlphaGo&#xff0c;但比起“遥不可及”的围棋机器人&#xff0c;其实AI早就融入人们生活&#xff0c;就像苹果手机中的语音助手Siri&#xff0c;如此“平易近人”。从自动驾驶、机器人、…

unity开宝箱动画_[技术博客]Unity3d 动画控制

在制作游戏时&#xff0c;导入的箱子模型本身自带动画。然而&#xff0c;它的动画是一个从打开到关闭的完整过程&#xff0c;并且没有给出控制打开关闭的方法。最直接的想法是对该动画进行拆分&#xff0c;再封装成不同的动画状态&#xff0c;但是不巧的是&#xff0c;这个动画…

如何把一个软件嵌入另一个软件_自动化正在成为一个“软件”行业

摘要在智能制造时代&#xff0c;自动化行业正在成为一个软件行业&#xff0c;它正在改变着整个产业的未来&#xff0c;也将为制造业带来更为广阔的空间。自动化正在成为一个“软件”行业&#xff0c;在智能时代&#xff0c;软件正在成为自动化行业竞争的关键。自动化已然成为软…

python怎么显示求余的除数_Python算术运算符及用法详解

算术运算符也即数学运算符&#xff0c;用来对数字进行数学运算&#xff0c;比如加减乘除。下表列出了 Python 支持所有基本算术运算符。表 1 Python 常用算术运算符运算符说明实例结果加12.45 1527.45-减4.56 - 0.264.3*乘5 * 3.618.0/除法(和数学中的规则一样)7 / 23.5//整除…

HTML td 标签的 colspan 属性

表格单元横跨两列的表格&#xff1a; <table border"1"><tr><th>Month</th><th>Savings</th></tr><tr><td colspan"2">January</td></tr><tr><td colspan"2">Fe…

Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

作者&#xff1a;Antonio Leiva 时间&#xff1a;Jan 5, 2017 原文链接&#xff1a;https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式函数&#xff0c;所以它是Kotlin和任何其他现代开发语言的最强工具之一。 在Java6中&#xff0c;我们仅能下…

Pyhon进阶9---类的继承

类的继承 基本概念 定义 格式如下 继承中的访问控制 class Animal:__CNOUT 0HEIGHT 0def __init__(self,age,weight,height):self.__CNOUT self.__CNOUT 1self.age ageself.__weight weightself.HEIGHT heightdef eat(self):print({} eat.format(self.__class__.__name__…

quartz教程二

转载于:https://www.cnblogs.com/mumian2/p/10729901.html

python把图片转为字符画_Python 实现图片转换为字符画

主要使用 pillow如果没有安装 使用 pillow install pillow 安装一下看代码&#xff1a;from PIL import Imageimport argparse#字符画所用的字符集ascii_char list("$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. ")def get…

76. Minimum Window Substring

最后更新 一刷 08-Jan-2017 昨天Amazon group面结束&#xff0c;刚回家。 国内以前喜欢的女生结婚了&#xff0c;嘿嘿...好开心呀~~ 这次面试感觉自己的做法完爆别人&#xff0c;比什么2 greedy好多了 总之表现比想象的好&#xff0c;最后一面的面试官真是聪明得一逼&#xff…

mysql浅拷贝_深拷贝与浅拷贝

在Python中&#xff0c;对象赋值实际上是对象的引用。当创建一个对象&#xff0c;然后把它赋给另一个变量的时候&#xff0c;Python并没有拷贝这个对象&#xff0c;而只是拷贝了这个对象的引用。1、浅拷贝&#xff1a;利用切片操作、工厂方法list方法拷贝2、深拷贝&#xff1a;…

iOS中的颜色

最近在改Bug的时候&#xff0c;才注意到iOS 中的颜色竟然也大有文章&#xff0c;特来记录一下。 先说一下问题&#xff0c;因为某界面中有用xib实现的一个view&#xff0c;而这个view 只在UIColletionView的layout 里通过nib 注册使用&#xff0c;为这个xib设置了背景色&#x…

多线程的基础知识

1、程序、进程、线程的基本概念 程序&#xff1a;为了完成某种任务用某一种语言编写的一组指令的集合就叫程序。程序就是一段静态的代码。 进程&#xff1a;进程是程序的依次执行过程&#xff0c;或者说是正在运行的一个程序。这是一个动态的过程&#xff0c;有它自身的产生运行…

springboot实现单点登录_什么是单点登录,php是如何实现单点登录的

文章来自&#xff1a;php中文网链接&#xff1a;https://www.php.cn/php-weizijiaocheng-429869.html作者&#xff1a;中文网商务合作:请加微信(QQ)&#xff1a;2230304070视频教程分享码农网&#xff1a;http://www.mano100.cn/rjyfk_url-url.html &#xff0c;升级终身会员即…