第四章java基础知识
4.1基本概念
一、java优点
1.面向对象(封装、继承、多态)
2.可移植性。平台无关,一次编译,到处运行。Windows,Linux,macos等。java为解释性语言,编译器把java变成中间代码然后在JVM上解释执行。
3.提供内置类库,简化开发eg:支持多线程、网络通信、提供垃圾回收器等
4.提供对web应用开发的支持。eg:applet、servlet、jsp等可开发web;socket、RMI可开发分布式
5.安全性+健壮性。eg:在网络环境中应用,提供防止恶意代码攻击的安全机制(数组边界检测和bytecode校验等);强类型机制、垃圾回收器、异常处理和安全检查机制。
6.去除了c++语言中难以理解的东西,比如头文件、指针、结构、单元、运算符重载、虚拟基础类、多重继承等
二、java与c++/c的异同点
java |
C++ |
·解释性语言 ·运行过程: 源代码-java编译器->字节码-JVM解释执行 ·执行速度比C++慢,能跨平台执行 |
·编译性语言 ·运行过程: 源代码-编译、链接->可执行的二进制代码 ·不能跨平台执行 |
纯面向对象。 1.所有代码必须在类中实现,除基本数据类型外所有类型都是类 2.不存在全局变量或全局函数 【java中的方法属于类中的成员x ——静态方法属于类成员,用static修饰;动态方法属于实例成员】 |
兼具面向对象和面向过程的特点 可定义全局变量和全局函数 |
没有指针概念,防止了C语言中操作指针可能引起的系统问题,而使程序更安全 |
|
不支持多重继承,但是引入了接口概念,可以同时实现多个接口。接口具有多态性,可利用接口实现与C++语言中多重继承类似的目的 |
|
提供了垃圾回收器来实现垃圾的自动回收,不需要程序显式管理内存分配。 无析构函数,引入了finalize()方法,当垃圾回收器要释放无用对象的内存使,首先调用该对象的finalize()方法。因此开发人员无需关心内存释放问题 |
需开发人员管理对内存的分配(申请、释放等)释放:析构函数 |
不支持运算符重载 |
支持 |
没有预处理器(头文件、宏定义等) 提供的import机制类似于C++的预处理器 |
支持预处理 |
不支持默认函数参数 |
支持 |
不支持goto语句(goto是保留关键字) |
支持 |
不支持自动强制类型转换,必须由开发人员显式地进行 |
支持,会导致程序的不安全 |
不包含结构和联合,所有内容封装在类里面 |
结构和联合所有成员均为公有,会导致安全性问题 |
平台无关,对每种数据类型都分配固定长度 |
同一数据类型在不同的平台上会分配不同的字节数 |
提供对注释文档的内建支持,源码文件可包含自己的文档。通过一个单独的程序可提取文档信息,并重新格式化成html |
|
包含完成特定任务的标准库,缩短开发周期 eg:JDBC库访问数据库,用于实现分布式对象的RMI等 |
依靠非标准的。厂商提供的库 |
三、public static void main(String[] args)
程序入口方法,JVM运行程序时首先查找main()方法
·public:权限修饰符,表明任何类或对象均可访问
·static表明main是静态方法,方法中的代码存储在静态存储区,类被加载后不需要实例化对象即可直接通过类名.main()访问。能找到则执行,否则报错
·void:无返回值
·main是用来给JVM识别的特殊方法名
每个类中都可以定义main()方法,但是只有与文件名相同的且被public修饰的类中的main()方法才能作为整个程序的入口方法
·String[] args 字符串数组参数args为开发人员在命令行状态下与程序交互提供了手段
·javac编译:javac
参考:https://blog.csdn.net/cunjiu9486/article/details/109077115
用命令行编译java程序并执行
javac D:/t1.java
java D:/t1
1 2 3 4 5 6 7 |
public class t1 { public static void main(String[] args) {// args由JVM赋值,谁调用方法谁赋值 //public与static没有先后顺序关系,反过来也合理 //也可以把main定义为final:public static final void main(String[] args) //synchronized也可以修饰main:public static synchronized void main(String[] args) //不能用abstract。必须返回值为void。且有关键字static和public修饰 System.out.println("sss1"); System.out.println(args.length);// args初值为0 for (int i = 0; i < args.length; i++) { System.out.println(args[i]);// 遍历数组,输出数组元素 } } } |
若赋值:
由此可知,在运行java程序时,类名 后面紧跟一个或多个字符串(多个字符串以空格隔开),JVM就会把这些字符串一次赋值给args数组元素。第一个参数对应第一个数组元素,第二个参数对应第二个数组元素。若参数本身包含空格,则应""起来,否则空格会被当成分隔符。
四、如何在main()方法执行之前输出helloworld?
A:
1:public class Test{
static{
System.out.println("hello world");//静态块不管顺序如何都会在main方法前执行
}
public static void main(String[] args){
System.out.println("hello my world");
}
}
2:public class Test{
public static void main(String[] args){//main方法是最先加载的,但不意味着是第一个被执行//的模块。在java语言中,静态块在类被加载时,就会被调用
System.out.println("hello my world");
static{
System.out.println("hello world");//执行结果与1相同
}
}
}
五、java程序初始化顺序
实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有所有类成员完成初始化之后,才会调用对象所在类的构造函数创建对象。
三个原则~
1.静态>非静态。静态只初始化一次,非静态可能会初始化多次
2.父类>子类
3.按照成员变量的定义顺序进行
【未完待续】