JVM、JRE、JDK
- JVM表示java虚拟机,Java程序需要运行在虚拟机上,不同平台有自己的虚拟机,所以java可以实现跨平台运行;
- JRE表示java运行环境,包括java虚拟机和一些核心类库。(核心类库主要是java.lang包:java程序运行时不可缺少的一些系统类);
如果需要运行一个开发好的java程序,安装JRE就可以了。
- JDK表示java开发工具,也包括JRE,其中包括编译工具,打包工具等。
跨平台性的原理
跨平台性:一次编译可在多个系统平台上运行
原理:java程序是通过java虚拟机在系统平台上运行的,只要该系统安装了相应的虚拟机就可以运行该程序。
java语言的特点
- 简单易学;
- 面向对象;
- 平台无关性(JVM);
- 支持多线程;
- 健壮性;
- 安全性(强类型语言、异常机制、垃圾回收);
- 支持网络编程并且很方便。
字节码
字节码:java源代码经过虚拟机编译后生成的.class
文件。
采用字节码的好处:解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言的可移植性问题。总结起来就是高效、可移植
补充:java程序的执行过程
java源代码---->编译器---->JVM可执行的字节码文件---->JVM---->JVM中解释器---->机器可执行的二进制机码---->程序运行
java和c++的区别
- 都是面向对象的语言;
- java不提供指针来直接访问内存,程序内存更加安全;
- java支持单继承,c++支持多继承(但java的接口可以实现多继承);
- java有内存管理机制,不需要手动释放无用内存。
java编码
采用Unicode编码,为每个字符都制定了唯一的数值,所以在任何语言、平台、程序都可放心使用。
java注释
- 单行注释 //
- 多行注释 /* * /
- 文档注释 /** * /
补充:多行注释和文档注释不能嵌套使用
this
this是自身的一个对象,可以理解为:指向对象本身的一个指针。
用法:
- 普通的直接引用,指向对象本身的一个指针;
- 形参与成员名字重名,用this做区分;
- 引用本类的构造函数。
super
super是指向自己直接父类的一个指针。
用法:
4. 普通的直接引用,指向当前父类的一个指针;
5. 子类中成员变量和方法与父类中的变量和方法重名,用super做区分;
6. 引用父类的构造函数。
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句);
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
this和super的区别
- super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数;
- this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名);
- super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的构造方法;
- super()和this()均需放在构造方法内第一行;
- this和super不能同时出现在一个构造函数里面;
- this()和super()都指的是对象,所以,均不可以在static环境中使用;
- 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
static
static的特点:
- 被static修饰的变量或者方法是独立于该类的任何象,不属于任何一个实例对象,而是被一个类所有的实例对象
共享
;
- 在该类被
第一次
加载的时候,就会去加载被static修饰的部分;
- static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配;
- 被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
static的意义:
- 创建独立于具体对象的域变量或者方法。就可以在没有创建对象的情况下,也能使用属性和调用方法;
- 形成静态代码块以优化程序性能(static块只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。)
static的应用场景:
- 修饰成员变量;
- 修饰成员方法;
- 静态代码块;
- 修饰类【只能修饰内部类也就是静态内部类】;
- 静态导包
static注意事项:
- 静态只能访问静态;
- 非静态既可以访问非静态的,也可以访问静态的。
多态的补充
多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口 (实现接口并覆盖接口中同一方法)
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)
一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。