拿着JAVA参考书,一章一章的走过
目前先整理这么多
风.fox
编程范式:
Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int、double、boolean、byte、float、 long、short、char。但是念在每个Java每个基本数据类型都有包装类(int的包装类是Integer)的基础上,就姑且认为一切是对象吧。
PHP:即使用可面向对象的方式编程,又可使用面向过程的方式。这种两种编程范式结合的语言代表了计算机语言以后的一个发展趋势,在Scala、Golang、Python中都有体现。
OOP 面向对象
封装
继承
多态
执行入口方法
JAVA中程序入口是 main方法,没有则报错
PHP中不需要入口方法,随时都可以运行
JAVA
class main{
public static void main(String args[]){
/......
}
}
基本元素
JAVA或PHP程序
是由空白符,标识符,字面值,注释,运算符,分隔符以及关键字组合而成
空白符
可以是空格,制表符,换行符
JAVA和PHP 都相同
标识符
标识符用于命名事物,例如类,变量以及方法。
标识符可以是大写或者小写字母,数字,下划线,美元符号等字符组成的任意字符序列
不能以数字开头,防止与数值产生混淆
都是大小写敏感的
PHP唯一与JAVA不同的是 变量要以$号为开头,其他都相同
字面值
数据类型中介绍
注释
// 或者 /* */ 注释方式
PHP和JAVA是相同的
分隔符
() {} [] ; , . (JAVA)
() {} [] ; , / -> :: (PHP)
java 和PHP 从 . 号开始不一样,
JAVA 中 . 用于将包的名称与子包以及类的名称分隔开,也可以用于将变量或方法与引用变量分隔开。
如果在PHP中,“\”用于将包的名称与子包以及类的名称分隔开,“->”用于将变量或方法与引用变量分隔开。
PHP中 :: 是静态参数(变量,常量,方法)与引用变量或者类分割开
(我觉得PHP中,不用 . 分隔符是语言设计中永远的一个痛)
关键字
JAVA和PHP中的关键字部分相同
数据类型
java是编译型强类型的语言,变量必须声明类型
php是解释型弱类型的语言,变量不必声明类型
基本类型
整型
浮点型
字符型
布尔型
整形
java
名称 长度(宽度)
byte 8
short 16
int 32
long 64
整形字面值中可以嵌入一个或多个下划线(程序编译时,自动忽略下划线),方便阅读。
下划线只能用于分割数字,不能位于字面值的开头和结尾。
int x = 123_12__123;
php
int 长度与平台有关,32位平台,64位平台
浮点型
JAVA
double 64 双精度
float 32 单精度
字面值中可以嵌入一个或多个下划线(程序编译时,自动忽略下划线),方便阅读。
下划线只能用于分割数字,不能位于字面值的开头和结尾。
double num = 9_12__23.2__123_23;
PHP
float 长度与平台有关,32位平台,64位平台
字符型
布尔型
JAVA 和PHP 相同
PHP特有数据类型(也可以说分类不同吧)
Array 数组
Object 对
Resource 资源类型
NULL
Callback 回调类型
变量
java是编译型强类型的语言,变量必须声明类型
php是解释型弱类型的语言,变量不必声明类型,且$符号作为变量的前缀
变量可以是大写或者小写字母,数字,下划线,美元符号等字符组成的任意字符序列
java 和php 区分大小写,赋值,变量的作用范围,成员变量与局部变量(作用同,使用方法不同)这些方式相同
JAVA
int x = 123123;
int a; //初始化
java 变量声明不能以数字开头
有很多保留关键字
PHP
$x = 123123;
符号作为变量的前缀没有保留关键字(开头)
数组
JAVA
int arr[];
int arr2[]=new int[12];
int duo[][]=new int[9][3];
PHP
php中最强大的就是数组
$arr=[];
$arr2=[1,2,3];
$duo=[[1,2,3],[3,3,4]];
$sss=[['A'=>'c','h'=>'d'],['b'=>'d']];
运算符
JAVA
算术运行符:+、-、*、/、%
赋值运行符:+=、-=、*=、/=、%=
自增/自减运行符:++、–
关系运算符:==、>、<、>=、<=、!=
逻辑运行符:&&、||、!、^
PHP(包括上面的,还有)
类型运算符:instanceof
数组运算符:+、==、===、!=、<>、!==
字符串运算符:+
执行运算符:“
错误控制运行符:@
位运算符
三元运算符
JAVA和PHP都一样
控制语句
if else
JAVA
if(a ==1){
}else if(a ==2){
}else if(a ==3){
}else{
}
PHP(包括上面的,还可以写成)
if($a ==1){
}elseif($a ==2){
}elseif($a ==3){
}else{
}
switch
可以是数值,字符类型
java 和 PHP 几乎相同
循环语句
for,while,do while
java和php基本使用方法都相同
java for 的 foreach 版本
int nums[]={1,2,3,4,5,6};
int sum=0;
for(int x: nums){
sum+=x;
}
PHP foreach
$nums=[1,2,3,4,5,6];
$sum=0;
foreach($nums as $x){
$sum+=$x;
}
跳转语句
break
continue
return
java 和php 基本写法相同
java 版 break 的 goto版本
less: {
for(int i=0;i<10;i++)
{
........
break less;
}
}
PHP goto
less: {
for($i=0;$i<10;$i++)
{
........
goto less;
}
}
类
java每个类会生成一个.class文件
php每个文件为.php文件
类修饰符
abstract(同)
final(同)
public(PHP没有)
变量修饰符:
静态变量修饰符 static(同)
静态初始化器 static{}(PHP没有)
最终常量 final(同) (建议用static代替)
易失变量 volatile(PHP没有)
方法修改饰
抽象方法 abstract(同)
静态方法 static (同)
最终方法 final(同)
本地方法 native(PHP没有)
多线程同步方法 synchronized(PHP没有)
访问控制符,JAVA比PHP多了包的概念
JAVA的public可以修改类,PHP不可以;其他相同
JAVA的默认是同一包中可见,PHP默认是任何地方可见
类或方法的引用
java是使用”.”点号引用属性与方法,
PHP是使用”->”引用属性与方法,没有点号用法
JAVA
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
}
Box mybox3;//声明
mybox3=new Box();//实例化
Box mybox=new Box();// 声明
Box mybox2=new Box(10,20);// 声明
java的class可以定义为public,此时文件名要与公共类完全一致,PHP中没有这个功能,如果不包含公共类,则class与PHP声明一样
php
class Box{
private $width;
private $height;
public __construct(int $w,int $h){
}
}
$mybox2=new Box(10,20);// 声明
方法
JAVA有返回值类型,PHP必须有关键字function
JAVA中的main(String args[])特殊方法,php中没有
返回值
java
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
public int show(){
}
public static void main(String args[]){
}
}
构造函数
java
JAVA 中构造函数的名称和包含他的类的名称相同,并在语法上和方法类似。因为方法支持重载,所有可以由多个构造函数
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
}
Box mybox3;//声明
mybox3=new Box();//实例化
Box mybox=new Box();// 声明
Box mybox2=new Box(10,20);// 声明
PHP
php 中方法不支持重载,所以只能有一种,如果需要更多,可以通过其他方式实现
class Box{
private $width;
private $height;
public function __construct(int $w,int $h){
}
}
$mybox2=new Box(10,20);// 声明
对象销毁
java和php 中使用方式相同
JAVA finalize 方法销毁对象
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
protected void finalize(){
//
}
}
PHP
class Box{
private $width;
private $height;
public function __construct(int $w,int $h){
}
public function __destruct () {
echo "clear";
}
}
this表示当对象
Java的this 表示当对象,一般情况下不必写
PHP也使用this表示当对象,这点相同
PHP使用self表示当前类,Java没有这个关键字,也不需要使用表示类
PHP在调用本类中的静态变量和方法时,必须使用self关键字和::,JAVA中直接使用
方法重载
JAVA支持方法重载,PHP不支持
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
public int show(int x){
System.out.println(x);
return x;
}
public double show(double x){
System.out.println(x);
return x;
}
public String show(String x){
System.out.println(x);
return x;
}
}
class Show{
public static void main(String args[]){
Box box=new Box(10,30);
box.show("字符");
box.show(10);//整型
box.show(10.123);//浮点型
}
}
构造函数重载
JAVA支持构造函数重载,PHP不支持
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
public int show(int x){
System.out.println(x);
return x;
}
public double show(double x){
System.out.println(x);
return x;
}
public String show(String x){
System.out.println(x);
return x;
}
}
class Show{
public static void main(String args[]){
Box box=new Box(10,30);
Box box2=new Box();
}
}
将对象用作参数
java和PHP都支持
JAVA
class Box{
int width;
int height;
public Box(int w,int h){
}
public Box(){
}
public Box(Box ob){
width=ob.width;
height=ob.height;
}
public int show(int x){
System.out.println(x);
return x;
}
public double show(double x){
System.out.println(x);
return x;
}
public String show(String x){
System.out.println(x);
return x;
}
}
class Show{
public static void main(String args[]){
Box box=new Box(10,30);
Box clone_box=new Box(box);
}
}
PHP
class Box{
private $width;
private $height;
public function __construct($w=0,$h=0){
$this.width=$w;
$this.height=$h;
}
public function setData(Box $box){
$this.width=$box.width;
$this.height=$box.height;
}
public function __destruct () {
echo "clear";
}
}
$box=new Box(10,20);
$clone_box=(new Box())->setData($box);
返回对象
java 和php中返回对象 相同
包(命名空间)
java中叫包
PHP中叫命名空间
JAVA
package com.fox.lanmp;
class Box{
}
php
namespace com\fox\lanmp;
class Box{
}
包 引用
java
java 中 引用关键词 import
单独引用:import packageName.className;
包引用:import packageName.*;
package com.fox.lanmp;
import com.fox.util;
import com.fox.service.*;
class Box{
}
php
php 中命名空间 引用关键词 use;
单独引用 use packageName\classFile;
多个引用 use packageName{classFile,classFile2};
php中没有包引用
namespace com\fox\lanmp;
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
class Box{
}
接口和抽象类
java 和php 中 相同,某些写法不同
异常处理
JAVA和PHP 相同
JAVA
try {
// some code
} catch (SecondException e) {
// handle first and second exceptions
} catch (Exception e) {
// ...
} finally{
//
}
php
try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
} catch (\Exception $e) {
// ...
} finally{
//
}
抛出异常 throw
throw 关键词
java和PHP相同
方法 异常 throws
PHP中没有,JAVA中有
如果方法肯能引发自身不进行处理的异常,就必须指明这种行为,以便方法的调用者能够保卫他们自己以防备上述异常。可以通过在方法声明中提供throws子语句来完成该任务。
class Demo{
static void one throws IllegalAccessException{
System.out.println("one");
throw new IllegalAccessException("Demo");
}
public static void main(String args[]){
try{
one();
}catch(IllegalAccessException e){
System.out.println("CAUGHT " +e);
}
}
}
泛型
泛型,即“参数化类型”。
JAVA特有,PHP 没有
public class Container<K, V> {
private K key;
private V value;
public Container(K k, V v) {
key = k;
value = v;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
public class Main {
public static void main(String[] args) {
Container<String, String> c1 = new Container<String, String>("name", "findingsea");
Container<String, Integer> c2 = new Container<String, Integer>("age", 24);
Container<Double, Double> c3 = new Container<Double, Double>(1.1, 2.2);
System.out.println(c1.getKey() + " : " + c1.getValue());
System.out.println(c2.getKey() + " : " + c2.getValue());
System.out.println(c3.getKey() + " : " + c3.getValue());
}
}
输出
name : findingsea
age : 24
1.1 : 2.2