java的基础语法
- Java大小写敏感,类名首字母大写(每个单词首字母都应大写),方法名小写
- 源文件名必须和必须和类名相同,应当使用此类名作为文件名保存
- 主方法入口:所有的java程序由public static void main(string[] args)开始执行
Java修饰符
- 访问控制修饰符:default、public、protected、private
- 非访问控制修饰符:final、abstract、static、synchronized (修饰类中的方法和属性
不同的修饰符在包中的访问权限
- private表示私有,只能在本类中访问
- public表示公有在哪都能进行访问和引用
- protected表示受保护的
Java变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
继承
- 在java中,一个类可由其他类派生,若要创建一个类,而且已经存在一个类具有你所需要的属性和方法,那么就可以将新创建的类继承该类。
- 利用集成的方法,可以重用已经存在的类的方法和属性,而不用重写这些代码,被继承的成为超类,派生类称为子类
- Extends与implements实现继承,但所有的类都继承于java.lang.Object,当一个类没有继承关键字时,则默认继承object。
- Java不支持多继承,支持单继承,多重继承,不同类继承同一个类。
extends与implements 1、extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承. 2、JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements. 3、继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了 ; 比如 class A extends B implements C,D,E 4、extends 继承类;implements 实现接口. 5、类和接口是不同的:类里是有程序实现的;而接口无程序实现,只可以预定义方法! 6、Java也提供继承机制﹐但还另外提供一个叫interface的概念。由于Java的继承机制只能提供单一继承(就是只能继承一种父类别)﹐所以就以Java的interface来代替C++的多重继承。interface就是一种介面﹐规定欲沟通的两物件﹐其通讯该有的规范有哪些。
接口
- 接口可理解为对象之间的通信协议,接口只定义派生类要使用的方法,由派生类决定
接口的继承和实现:
- 接口里有方法的实现,方法不能具有主体,且修饰符是多余的
- 若接口A继承接口B,那接口A就继承了接口B的所有抽象方法。且可以实现多继承
源文件声明
- 一个源文件只能有一个public类
- 一个源文件可以有多个非public类
- 源文件的名称应该和public类名称保持一致
- 如果一个类定义在某个包中,那么package语句应该在源文件首行
- 如果源文件包含import语句,应该放在package定义之后和类定义之前
- Import语句对定义的源文件定义的所有类有效
Import语句
- 若给出一个完整的限定名,包括包名类名,即java编译器会很容易定位到源代码或类
- Import就是用来提供合理路径,使得编译器找到某个类
访问控制和继承
- 父类声明public,子类只能为public
- 父类声明未protected,子类只能为protected或public,不能为private
- 父类声明为private不能被继承
非访问修饰符权限
- Static 修饰类方法和类变量
- Final 修饰类、方法、变量,final修饰的类不能被继承,修饰的方法不能被继承类修改,修饰的常量不可修改
- Abstract 创建抽象类和抽象方法
- Synchroized和volatile 用于线程的编程
修饰符访问权限
命令行参数使用
- 传递命令行参数给main()函数使用(执行程序时紧跟在后的信息 args[]
重写和重载
- 静态方法不能被重写
、
JDBC连接数据库
- JDBC是SQL调用级的数据库编程接口,使用此接口客户端可访问各种不同的数据库,建立连接以及对数据库进行增删改查操作等
- 加载驱动程序
- 获得数据库连接
- 创建statement对象进行查询等操作
- 加载驱动之前应当先将数据库驱动器导入需要使用数据库操作的项目中/libs目录
JVM、进程、线程
JVM使一个Java虚拟机,我们正常编写的java程序被编译后会生成class文件,但是擦操作系统是无法识别此文件的,所以得利用JVM将程序要做什么转述给操作系统。
JVM针对不同的操作系统开发其对应的解释器,所以只要有操作系统所对应的JVM解释器,此java程序则一定能运行(一次编译到处运行)。
- JVM运行周期,程序开始运行至结束
- JVM中的线程分为两种:守护线程和普通线程
- 守护线程是JVM自己使用的线程,比如垃圾回收(GC)就是一个守护线程。
- 普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。
Java沙箱机制
- 沙箱是什么?
限制程序运行的环境,沙箱机制就是将java代码限定在虚拟机特定的运行范围中,并且严格的限制代码对本地资源的访问,通过这些措施来保证对代码的有效隔离,防止本地资源遭到破坏。 - Jvm运行机制
https://zhuanlan.zhihu.com/p/25713880 - Java沙箱安全策略
https://www.cnblogs.com/MyStringIsNotNull/p/8268351.html
策略文件
- 默认沙箱
- 通过Java命令行启动java程序默认不启用沙箱,若要启动沙箱则使用以下命令行
Java -Djava.security.manager 可执行文件 - 沙箱启动后,安全管理器会使用两个默认的策略文件来确认沙箱启动参数,也可通过命令指定。
Java -Djava.security.policy=可执行文件 - 若要求启动时只遵循一个策略文件,那命令行多加个参数
Java -Djava.security.policy==可执行文件
- 管理沙箱,最重要的则是策略文件,JVM可以使用多个策略文件,一个为全局,一个为用户自定义,可以存储在用户主目录下。
Runtime类
- Runtime类代表java程序执行的环境,每个java环境都有一个runtime实例,该类自动创建,可以通过Runtime.getRuntime方法获取当前程序的Runtime实例。
在jsp命令执行时会用到java.lang.Runtime的exec方法来执行命令..
实例化对象
类比于Cat a = new Cat(); 抽象化解释—
- 声明对象Cat one声明对象时,在栈中开辟一块区域,名为one;
- 实例化对象new Cat()实例化对象时,在堆中开辟一块区域,名为one;
使用赋值式“=”将两者相连
- 即先声明,后实例化,再使用赋值等式,将声明的对象指向实例化的具体空间
就是将堆中开辟的内存的地址,存放到了栈里。可以把内存地址看成Cat类的一把钥匙,
- 实例化后,one获得了这把钥匙,所以可以在类中任意拿东西,即调用属性、方法等。
因此可以通过对象名,操作具体对象的信息。其实,栈中存放的就是堆中某个内存的引用,这就是对象引用的概念。
实例化对象的方法
为了调用类中的动态方法,和属性等。静态方法可以直接调用如下
异常处理?
编译与反编译
编译:
低级语言是计算机认识的语言,高级语言是程序员认识的语言,编译的过程其实就是将高级语言转变为低级语言。
首先经过前端编译,将java文件编译成中间代码,这种就是class文件,即字节码文件。而后经过后端编译器,将class字节码文件编译为机器语言。
反编译:
与之对应,就是将低级语言转换成高级语言的过程。但是对于java可执行程序来说,反编译,可以通过将机器语言转变为高级语言,从而进行调试,代码审计等。这是危险的。
防止反编译的措施:
- 隔离JAVA程序,让用户接触不到Class文件
- 对Class文件进行加密,提高破解难度
- 代码混淆,将代码转换成功能上等价,但是难以阅读和理解的形式
JAVA static静态变量修饰符详解 :
静态变量、静态方法、静态代码块:
使用 static 修饰符修饰的属性(成员变量)、常量和成员方法称为静态变量、常量和方法,它们统称为静态成员,归整个类所有,不依赖于类的特定实例,被类的所有实例共享直接调用。只要这个类被加载,Java虚拟机就可以根据类名在运行时数据区的方法区内找到它们。 调用静态方法的语法: 类名.静态成员
静态变量:
成员变量:静态变量(类变量,指被static修饰的成员变量)、实例变量(没有被static修饰的成员变量) 静态变量和实例变量的区别:
- 对于静态变量,运行时,Java 虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。在类的内部,可以在任何方法内直接访问静态变量;在其他类中,可以通过类名访问该类中的静态变量。
- 对于实例变量,每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。在类的内部,可以在非静态方法中直接访问实例变量;在本类的静态方法或其他类中则需要通过类的实例对象进行访问。
静态变量可以被所有类的实例共享。
静态方法:
成员方法:静态方法和实例方法 区别:
- 静态方法不需要通过它所属的类的任何实例就可以被调用,因此在静态方法中不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法。另外,和 this 关键字一样,super 关键字也与类的特定实例相关,所以在静态方法中也不能使用 super 关键字。
- 在实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。
静态代码块:
静态代码块指 Java 类中的 static{} 代码块,主要用于初始化类,为类的静态变量赋初始值。
- 静态代码块类似于一个方法,但它不可以存在于任何方法体中。
- Java 虚拟机在加载类时会执行静态代码块,如果类中包含多个静态代码块,则 Java 虚拟机将按它们在类中出现的顺序依次执行它们,每个静态代码块只会被执行一次。
- 静态代码块与静态方法一样,不能直接访问类的实例变量和实例方法,而需要通过类的实例对象来访问。
内部类
可以将一个类的定义放在另一个类或者方法的定义内部,这就是内部类。
为什么要使用内部类?..
每个内部类都能独立的继承一个接口的实现,无论外围类是否已经继承了某个接口的实现,对于内部类来说都没有影响。
JAVA的普通类C1支持编写内部类C2,而在编译的时候,会生成两个文件C1.class与C1$C2.class,将此看作两个无关的类,通过Class.getName(“C1$C2”)即可加载这个内部类,获取以后再使用反射的方法获取这个类中的属性方法,也可由实例化这个类,并调用方法。
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点、必须是private属性的类 单例模式为了保证在一个进程中,某个类有且仅有一个实例。
public class Singleton {
// 静态字段引用唯一实例:
private static final Singleton INSTANCE = new Singleton();
// private构造方法保证外部无法实例化:
private Singleton() {
}
}
单例的构造方法必须是private属性,这样就避免了调用方自己创建实例,但是在类的内部是可以用一个静态字段来引用唯一创建的实例的。
单例模式的实现方式:
- 只有private构造方法,确保外部无法实例化;
- 通过private static变量持有唯一实例,保证全局唯一性
- 通过public static方法返回此唯一实例,使外部调用方获取到实例