Java编程基础知识包括以下内容:
-
Java语言特点:Java是一种面向对象的编程语言,具有跨平台性、强类型和静态类型检查、自动内存管理等特点。
-
Java的开发环境:Java的开发环境包括JDK(Java Development Kit)和IDE(Integrated Development Environment),如Eclipse、IntelliJ IDEA等。
-
基本语法:Java的基本语法包括变量、数据类型、运算符、控制流语句(if-else、for循环、while循环等)、数组等。
-
面向对象编程:Java是一种面向对象的编程语言,支持封装、继承和多态等面向对象的特性。类和对象是Java程序的基本组成单元。
-
异常处理:Java提供了异常处理机制,通过try-catch-finally 块来捕获和处理异常,保证程序的健壮性。
-
输入输出:Java提供了丰富的输入输出API,可以通过标准输入输出、文件操作、网络通信等方式进行数据的输入和输出。
-
集合框架:Java提供了一套集合框架,包括List、Set、Map等常用的数据结构和算法,方便处理和操作数据。
-
多线程编程:Java支持多线程编程,可以通过Thread类或Runnable接口创建线程,并使用syncd关键字实现线程同步。
-
强大的标准库:Java标准库提供了丰富的API,包括字符串处理、日期时间操作、网络编程、数据库操作等功能。
首先考虑一个问题:代码中没有主函数,程序能运行吗?
对于这个问题,我们创建一个文件夹,添加一个记事本后缀名改为.java,定义一个类(类名必须跟文件首字母大写)。利用cmd运行一下该程序,在这里用到了javac命令。如图运行后发现没有主函数,代码依然可以运行,只是找不到主函数,但不代表没有主函数不能运行。注意:用cmd运行程序时,要保证在编写代码时不能出错,如果有错误的话,cmd中不会提示错误,只显示编译失败。
补充知识:Java 程序从源代码到运行主要有三步:
编译:将我们的代码(.java)编译成虚拟机可以识别理解的字节码(.class)
解释:虚拟机执行 Java 字节码,将字节码翻译成机器能识别的机器码
执行:对应的机器执行二进制机器码
上面我们用到的javac就是在编译中起作用的,它是java中的编译源代码的命令工具,将.java文件编译成 .class 文件;程序成功运行以后,文件夹中自动生成了class文件:
拓展两个概念:1.SDK(编译器) 2.API(类)
SDK 指的是 Software Development Kit,即软件开发工具包,是针对特定软件平台或操作系统提供的一组开发工具、API 和文档等资源的集合。SDK 通常包含一个或多个库、示例程序、编译器、调试器、文档和其他辅助工具,旨在帮助开发者更轻松地开发应用程序、插件、驱动程序或其他软件组件。
API 指的是(Application Programming Interface,应用程序编程接口)是一些预先定义的接口,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。一般SDK中包含有API。
Java 语言编译与解释并存
编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。
Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须再经过 JVM,解释成操作系统能识别的机器码,在由操作系统执行。因此,我们可以认为 Java 语言编译与解释并存。
假设我们java项目找不到源代码了,但有部署后的class文件。现在只需要简单修改一个数字,如下面的代码:
if(a.equals("13"))
{
System.out.println("xxxxxxx");
}
现在只需要把13改成14,用编辑器直接打开class文件,找到13这个字符串,改成14,保存,替换掉原来的class文件可以实现数字的修改吗?
答案是:可以修改,前提是需要完全掌握Java字节码文件的格式,按照规则来修改,否则Java虚拟机是无法识别你改过的class文件的。建议先研究下class文件,每一个字节都是有特定含义的。这个修改可以对比修改前后class文件那些字节码不同,然后才知道改哪里,改的地方是什么含义,否则改了也没用。
既然有编译命令那就有反编译命令。javap可以将class文件编译成java代码显示出来。下面介绍两中反编译工具:
一、javap命令是JDK自带的反编译工具,用于反编译class文件。
使用javap命令反编译class文件步骤:
①打开命令行工具,进入.class文件所在的目录。
②键入javap -c -p classfile
,其中classfile为需要反编译的.class文件名。
③-c
表示反编译代码时显示代码中的所有指令。
④-p
表示反编译代码时显示代码中的所有类和成员变量名以及修饰符。
⑤查看输出结果,即为反编译后的代码。
二、Jad是一款免费的Java反编译器,可以将class文件反编译为Java源代码。
使用Jad反编译class文件步骤:
①下载Jad,并放在合适的位置(比如C:\jad
下)。
②将.class文件复制到Jad所在的目录下(比如C:\jad
)。
③打开命令行工具,进入Jad所在目录。
④键入jad -sjava classfile
,其中classfile为需要反编译的.class文件名。
⑤-sjava
表示将反编译结果输出到一个.java文件中。
⑥查看输出结果,即为反编译后的代码。
除此之外,javap还有其他命令选项,如下:
有了以上基础,我们能否自己开发一门编程语言?
简而言之,编程语言就是一组预定义的规则。然后,我们需要通过编译器、解释器等来解释这些规则。所以我们可以简单地定义一些规则,然后,再使用任何现有的编程语言来制作一个可以理解这些规则的程序,也就是我们所说的解释器。
编译器:编译器能够将代码转换为处理器可以执行的机器代码(例如 C++ 编译器)。
现在,我们就清楚了java是什么,由什么组成:
Java由Java虚拟机(Java Virtual Machine,简称JVM)、Java 应用编程接口(Application Programming Interface,简称API)、一套编译工具、一套插件库(JDK)、一套官方规范(java源码和jvm指令集规范表)。
理解静态方法和非静态方法之间的关系:
静态方法与非静态方法最主要区别就是在类中使用static修饰,而非静态方法是不加static修饰方法的,在类中定义没有占内存,只有在类中被实例化成对象时,对象调用该方法才被分配内存。
其次,静态方法中只能调用静态成员或者方法,不能调用非静态方法或者非静态成员,而非静态方法既可以调用静态成员或者方法又可以调用其他的非静态成员或者方法。总的来说非静态方法啥都可以调用。static方法可以用对象.方法名来调用,也可以用类名.方法名来调用。而非静态的方法只能创建对象后时调用。
注意main方法一定是static方法!!
public class Test {
public static void main(String[] args) {
int i=age(1,2);//注意这是在静态方法中调用了非静态方法
System.out.println(i);
}
public int age(int x,int y) {
return x*y;//非静态方法
}
}
上面这种就是错误的调用方法,静态方法调用非静态。解决办法有两种,一种是将下面非静态加一个static变为静态,就可以实现静态方法调用静态方法,就不会出错了。
解决办法一:将这个非静态方法用static变成静态方法调用
public class Test {
public static void main(String[] args) {
ttt();//静态方法调用静态方法是允许的
}
public static ttt() {//加入了static将其变成静态方法
System.out.println("teacher");
}
}
解决办法二:是静态方法调用非静态时要实例化才能被静态方法调用
public class Test {
public static void main(String[] args) {
Test test=new Test();//声明一个Test类型的变量,变量名test,new Test()就是实例化Test类
test.ttt();
}
public void ttt() {
System.out.println("teacher");//非静态方法
}
}
了解了静态和非静态方法之间的关系后,我们思考一下 static在重写时,会发生什么情况,他可不可以被重写?
答案是 : 不能重写。
首先我们要知道重写的目的:是子类不满足于父类的方法,想在父类原有的方法上加上属于自己的东西,从而得到我们想要的结果。
虽然被static修饰的父类方法,子类也可以取相同的方法名、相同的修饰符、相同的返回值类型,但实际上已经不是同一个方法了。举个例子:
class Father{ //父类
public static void father(){
System.out.println("father");
}
}
class Son extends Father{ //子类继承父类
public static void father(){ //子类重写父类的方法
System.out.println("son");
}
}
class Test{
public static void main(String[] args){
Father son=new Son();
son.father(); //输出的结果为father
}
}
所以,static修饰的方法是不能重写的,但是可以继承,所以这就是不能和abstract共用的原因,被abstract修饰的方法是要子类去重写实现的。
java抽象类 abstract 抽象方法的定义
抽象方法:只有方法的定义,没有方法体的实现,这种方法就是抽象方法
抽象类: 一个类中如果有抽象方法,那么这个类就是抽象类
抽象类以及抽象方法格式定义
抽象类:public abstract class A{}
抽象方法: abstract void method(); // 注意:抽象方法是没有方法体的,也就是没有大括号{}
构造器:抽象类可以有构造器。因为抽象类是可以被继承的,所以其子类在实例化时需要调用父类的构造器。抽象类的构造器通常用于初始化父类中的成员变量,并在子类中被继承。抽象类中的构造器不能被实例化,只能通过其子类来调用。
在 Java 中,抽象类可以有多种类型的构造器,例如:无参构造器、带参构造器等。抽象类的构造器在子类中通过 super 关键字调用。