扩展名.java --> 扩展名.class --jvm虚拟机–> 适合系统的字节编码 --> 编译执行
jvm:虚拟机,实现java跨平台以及编译运行的核心
jdk: java开发工具包
jre: java运行环境
三者关系:jdk开发工具包中包括jre运行环境,如果只是运行java代码的话,只需要jre运行环境即可。jre和jdk中都包含jvm的一些部分,而jvm虚拟机中包含许多类解析器和加载器
基本类型(字节数)
byte (1)
short(2)
int(4)
long(8)
float(4)
double(8)
boolean(1)
char(2)
自动转变规则:由数据范围小的向数据范围大的转变
强制转换规则:超出基本数据类型的数据范围时间,使用强制类型转换
两者都是跳出循环,只是跳出层次不同
注意:在多层循环中,最外层出现标注时间,使用beak "标注”,程序会跳出多重循环
代码如下:
int i,j;
A:for(i=0;i<3;i++) {
System.out.println("i="+i);
for(j=0;j<5;j++){
System.out.println("j="+j);
if(j==2)
break;
}
}
类是对象的抽象,对象是类的具体实现
例子:”人类“是一个概括类,而”小王“是该类的具体实现
两者都是编程的一种思维,现有面向过程,才有面向对象
面向对象的出现是为了补充面向过程的不足
类比:
现在有"蛋炒饭”和"盖浇饭“两种,前者是面向过程,后者是面向对象,对于”盖浇饭“而言,菜和饭都是两个具体的对象,菜不满意,可以换,饭不满意也可以换,处理就可变的很灵活,也就是程序上的可维护性良好
区别:
面向过程是函数式编程为主,面向对象是以对象为主
面向过程有类的继承和多态性,而面向过程没有
相辅相成:
面向过程将复杂的问题抽象化,简化成具体的微小问题,然后使用面向过程思维来解决
this是自身的引用,一般用于区别成员变量和局部变量
super对直接父类的引用,可以调用父类的成员变量和成员方法(private修饰不能调用)
也可调动父类的构造方法,但是只能在子类的构造方法中使用
可以修饰方法、变量、代码块、内部类
static属性属于类所有,所有实现类共享一个static属性
注意:
public class StaticClass {
static String name="123456";
int age;
String sex;
public StaticClass(String sex,int age) {
this.sex=sex;
this.age=age;
}
static {
System.out.println("Name:"+name);
}
public static void SS() {
System.out.println("name1111:"+name);
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("StaticClass:"+StaticClass.name);
StaticClass st1;
StaticClass.SS();
st1 = new StaticClass("123",10);
System.out.println("st1.name:"+st1.name);
}
}
运行结果:
结论:可以看到,静态方法在该类第一次调用时就开始运行,并且只运行一次
final: final可修饰属性 类 方法。
被修饰的变量不可更改
被修饰的类不可被继承
被修饰的方法不可被重写
abstract:acstract可以修饰类和方法
被修饰的类必须被继承
被修饰的方法必须被重写
注意:final修饰的变量不可被更改,也就变成了常量。而修饰的引用类型,其引用不可被更改,但是类型的属性可被更改
finally:使用 try 和 catch 抛出异常时间使用finally.
当用异常事件
finalize: 在object对象中被定义,用于垃圾回收器删除对象之前调用,做必要清理工作
注意:
A:
public static void main(String[] args) {
try{
System.out.println("error before");
int i;
i = 10/1;
return ;
//System.out.println("error after");
}catch(Exception e){
System.out.println("error");
}finally{
System.out.println("finally");
}
}
B:
public static void main(String[] args) {
try{
System.out.println("error before");
int i;
i = 10/0;
return ;
//System.out.println("error after");
}catch(Exception e){
System.out.println("error");
}finally{
System.out.println("finally");
}
}
运行结果:
结论:可看到无论代码是否抛出异常或者使用return,finally中的代码总会被执行
用于给代码加锁,被修饰的代码,每次只能一个线程进入进行处理,其他线程等待
被修饰的方法被称为同步方法,被修饰的代码块被称为同步代码块
两者区别在于:
同步方法的范围较大,同步代码块可以在方法内部,相对来说范围较小
一般来说,范围越大,性能越低
构造函数:
A:
public class Base {
String name;
public Base() {
name = "123456";
System.out.println("fu");
}
}
public class BNext extends Base{
public BNext() {
System.out.println("zi");
}
public BNext(String name) {
super.name = name;
System.out.println("name zi");
}
}
public static void main(String[] args) {
BNext base = new BNext();
}
B:
public class Base {
String name;
public Base() {
name = "123456";
System.out.println("fu");
}
public Base(String name) {
this.name = name;
System.out.println("name fu");
}
}
public class BNext extends Base{
public BNext() {
System.out.println("zi");
}
public BNext(String name) {
super(name);
System.out.println("name zi");
}
}
public static void main(String[] args) {
BNext base = new BNext("12345");
}
public class Base {
String name;
public Base() {
name = "123456";
System.out.println("fu");
}
static {
System.out.println("static base");
}
public static void sysoName() {
System.out.println("static name");
}
public Base(String name) {
this.name = name;
System.out.println("name fu");
}
}
public class BNext extends Base{
public BNext() {
System.out.println("zi");
}
public BNext(String name) {
super(name);
System.out.println("name zi");
}
static {
System.out.println("static BNext");
}
public static void sysoName() {
System.out.println("static BNext name");
}
}
public static void main(String[] args) {
BNext base = new BNext();
BNext.sysoName();
}
== 作用
- 基本数据类型,比较的是数值
- 对象比较的是地址
- 不能比较没有父子关系的两种类型
equals 作用
- 系统中的类一般都会重写equals方法,比较的是内容
- 类本身没用重写该方法,会调动父类的该方法
- 自定义类小覆盖父类的equals方法
注意:object的equals方法比较的地址,此时和==作用相同
基本数据类型都对应了java中的包装类,由于java中是面向对象,而基本数据类型不是一个具体对象,实际使用时有不便之处
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i);
}
对于-128~127之间的数值,直接进行缓存,下次使用直接拿出,而范围之外的数字,则是创建了新的对象。
序列化:在java中将一个实体类的状态信息写入字节流,使其可以通过socket传输,或者是写入数据库、文件系统中持久化,当使用时间,将字节流拿出,重写还原创建该实体对象
注意:第一种和第二种都需要通过构造方法来创建对象,第三种是直接对已有对象进行克隆,第四种是从文件中还原对象
1:
Integer a = new Integer(3);
2:
public static void main(String args[]){
try {
Class class1 = Class.forName("java.lang.Integer");
Integer a = (Integer) class1.newInstance();
}catch (Exception e){
System.out.println(e);
}
}
3:
public static void main(String args[]){
try {
Class class1 = Class.forName("java.lang.Integer");
Constructor con = class1.getConstructor();
Integer a = (Integer) con.newInstance();
System.out.println();
}catch (Exception e){
System.out.println(e);
}
}
4:
public class Hello implements Cloneable{
public void sayHello(){
System.out.println("hello !");
}
public static void main(String args[]){
Hello h1 = new Hello();
try{
Hello h2 = (Hello) h1.clone();
h2.sayHello();
}catch(Exception e){
System.out.println(e);
}
}
}
5:反序列化来创建对象
FileInputStream in1 = new FileInputStream(f);
ObjectInputStream oos = new ObjectInputStream(in1);
简单来说,可以这样理解:hashcode的相等是equals为true的前提。hashcode相等,equals不一定为真,但是equals为真,那么hashcode一定相等
HashMap中,key的比较是两个都要比较,先比较hashcode,再比较equals。两者都是继承自父类。追根结底是要比较地址。若两者不一起重写,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。