1、JDK与JRE
JDK
我们把Java编程语言、Java API类库和Java虚拟机三部分统称为JDK(Java Development Kit),JDK包括:JRE,Java基本类库,Java开发工具如编辑器、调试器等。JDK是用于支持Java程序开发的最小环境。
JRE
我们把Java API类库中的Java SE API 子集和Java虚拟机两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。
二者区别与联系
JDK范围涵盖JRE,JRE是JDK的子集。如果仅仅是运行Java程序,用户计算机仅需配置JRE;如果用户想要自己开发Java程序,那么则需要安装配置JDK。
2、JVM
机器与编译程序之间一层抽象的虚拟机器,在任何平台上都提供给编译程序一个共同的接口,编译程序只需要面向虚拟机,由解释器将虚拟机代码转换为特定系统的机器码执行。
3、Java与C++的区别
- Java提供了对内存的自动垃圾回收,程序员无需在程序中进行分配、释放内存的操作;
- Java去除了指针,用诸如引用的方法来代替,避免了赋值语句与逻辑运算语句混淆;
- Java没有类的多重继承,但有接口的多重继承。
4、声明变量
- 指定在内存中分配空间的大小;
- 规定这个变量所能接受的运算。
5、Java中的数据类型
基本数据类型
数值型
整数类型(byte 8位,short 16位,int 32位,long 64位)
浮点类型(float 32位,double 64位)
字符型(char 16位)
布尔型(boolean 1位)
引用数据类型
类(class)
接口(interface)
数组(array)
…
6、Unicode编码
Java中默认采用的编码方式是Unicode编码,是一种十六进制编码,可以表示世界上任意一种文字信息。所以Java中的单个char可以保存中文字符(2字节),而在C/C++中,中文字符只能当作字符串处理。
7、短路逻辑运算
&&、|| ,先对左边的语句进行判断,符合运算符要求后再判断右边语句,否则直接退出运算。
8、null值
基本数据类型有默认值,无法将null赋值给基本数据类型变量。
9、封装、继承与多态
封装
封装是一种信息隐蔽技术,使数据和加工该数据的方法封装为一个整体,以实现独立性很强的模块,使用户只能看到对象的外特性(对象能接收哪些消息,具有哪些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者与对象的使用者分开,使用者不必知晓其行为实现的细节,只需使用设计者提供的消息来访问对象。
良好的封装可以提高代码的模块化程度,防止对象之间的不良的相互影响,使程序达到高内聚(许多功能尽量在类内部独立完成,不让外部干预),低耦合(提供给外部尽量少的方法调用)的终极目标。
继承
子类共享其父类数据和方法的机制,可以对父类进行扩展,是我们非常方便地复用以前的代码。
多态
对象根据所接收的消息而做出动作,不同的对象接收相同的消息会做出不同的动作。
在Java中,分为方法的多态性与对象的多态性。
方法的多态性
重载与重写
重载是指两个方法具有相同的方法名,但是入参的个数或类型或顺序不同,那么传入参数时会调用相应的方法;
重写是指子类继承父类时,拥有与父类方法的入参及返回值类型完全相同的方法,但子类的该方法接收消息时会执行子类的方法;
对象的多态性
对象的多态性主要体现在父子类对象之间的相互转型。
10、栈内存与堆内存
在Java中,栈是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本数据类型的变量,指令代码,常量及对象句柄(对象的引用地址)。
栈内存的操作方式类似于数据结构中的栈,优势在于它的存取速度较快,仅次于寄存器,栈中的数据还可以共享。缺点表现在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
堆是一个程序运行动态分配的内存区域,在Java中,构建对象所需要的内存从堆中分配,放弃分配方式类似于链表。堆内存在使用完毕后,由垃圾回收器隐式回收。这一点上与C++不同,C++中堆内存的分配和回收都是显式的,由用户负责,如果用户申请了堆内存而在使用后忘记释放,则会产生“内存溢出”问题–可用内存存在,而其他用户无法使用。堆的优势在于动态分配内存大小,按需分配,其生存期也不必事先告诉编译器。在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。其缺点为,由于要在运行时动态分配,相比于栈内存,存取速度较慢。
由于栈内存较小,如果不慎耗尽,则产生堆栈溢出 Stack Overflow问题。
堆内存使用不当则会产生内存碎片。回收堆内存时可能产生一些小块但不连续的内存,从而导致用户申请一块较大的堆内存时,虽然可用内存总和够大,但由于不连续导致申请失败。
11、final关键字的使用
- 使用final修饰的类无法被继承;
- 使用final修饰的ff无法被子类重写;
- 使用final修饰的变量无法被修改,即为常量。
12、使用final关键字的好处
- 使用final可以提升性能,JVM和Java应用都会缓存final变量;
- final变量可以安全地在多线程环境下共享,不需要额外的同步开销;
- 使用final关键字,JVM会对方法、变量及类进行优化;
- 可以创建不可变类(如String)。
13、抽象类
1.抽象类和抽象方法都必须用abstract关键字修饰;
2.抽象类不能实例化,不能直接用new关键字去产生对象;
3.抽象类定义抽象方法时只需声明,不需实现;
4.含有抽象方法的类必须被声明为抽象类,抽象类的子类必须重写抽象类中的所有抽象方法才能够实例化,否则这个子类仍然是抽象类。
5.抽象类中可以有构造方法,但只能在子类中调用,子类实例化对象时首先默认调用父类的构造方法,再调用子类的构造方法;
6.抽象类不能被final修饰;
7.外部抽象类不能使用static关键字修饰,但内部抽象类可以被static关键字修饰,使用static关键字修饰的内部抽象类表示一个外部类。
14、接口
- 接口中的数据成员必须初始化,且均为常量,常见的是全局变量;
2.接口中不能像抽象类一样定义普通方法,所有方法必须全为抽象方法;
3.接口中允许定义default方法;
4.接口必须有子类,子类可以同时实现多个接口;
5.接口的子类(如果不是抽象类)必须重写接口中的全部抽象方法;
6.接口与一般类一样,本身也具有数据成员(final可省略)与方法(abstrat可省略)
15、static关键字的使用
1.使用static关键字修饰属性:静态属性,类的公共属性,可直接用类名访问;
2.使用static关键字修饰方法:静态方法,可由类名直接调用;
注意:静态方法与非静态方法都可以使用static属性,但静态方法不能调用非静态属性!
3.static 主方法:Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因Java虚拟机在执行main()方法时不必创建对象,因此该方法必须是static的。该方法接受一个String类型的数组参数,该数组中保存了执行Java命令时传递给所运行的类的参数。
16、内部类
- 提供了更好的封装,把内部类隐藏在外部类之内,不允许同一个包中的其他类访问内部类;
- 内部类成员可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节,如成员变量;
- 匿名内部类适合用于创建那些仅需要创建一次的类;
- 使用static关键字修饰的内部类属于外部类本身,也就是外部类;
17、匿名对象
匿名对象使用一次后,就会被Java的垃圾回收器回收。
18、System类
Java不支持全局方法和全局变量,Java设计者将一些系统相关的重要方法和变量收集到了一个统一的类中,这就是System类。
System类中所有的成员都是静态的。
exit(int status)方法,提前终止JVM的运行;
currentTimeMillis方法,返回自1970年1月1日0时0分0秒起至今以ms为单位的时间,这是一个long类型的大数值;
getProperties方法获得当前虚拟机的环境属性。
19、RunTime类
程序运行时,在每一个JVM进程之中都会存在唯一一个Runtime类的实例化对象。这是一个明显的单例设计模式,将构造方法私有化了。在类内部存在一个static定义的方法,用于取得本类的实例化对象。
public static Runtime getRuntime();
取得Runtime类的实例化对象后,可以获得一些内存信息:
最大可用内存数:public long maxMemory();
总共可用内存数:public long totalMemory();
空闲内存数:public long freeMemory();
如果程序之中出现过多垃圾,则会影响性能,此时可以清除垃圾:
public void gc()。
20、正则表达式
public boolean matches(String regex) 将字符串与正则表达式匹配验证;
public String replaceAll(String regex, String replacement) 按正则全部替换;
public String replaceFirst(String regex, String replacement) 按正则替换首个;
public String[] split(String regex) 按指定正则拆分;
public String[] split(String regex, int limit) 按指定正则拆分为指定长度的字符串数组;