零散知识点:
1.写好的java文件名后缀为.java
2.编译Java文件生成响应的字节码文件后缀为.class
3.虚拟机运行Java .class文件
4.Java文件中类型为public的类有两种,一种是外部类,一种是内部类
5.当外部类的类型为public时,文件名需要与其相同
6.当内部类的类型为public时,外部类不是public类型的,文件名可随意
7.return i++ 先return i,再i++
8.声明非静态内部类对象的方法:
Outer.Inner inner=new Outer().new Inner()
9.声明静态内部类对象的方法:
Outer.Inner inner=new Outer.Inner()
10.方法执行完毕,局部变量消除
Java的数据类型:
基本数据类型(或叫原生类,内置类型)8种:
整数:byte,short,int,long
浮点类型:float,double
字符类型:char
布尔类型:boolean
引用数据类型3种:
数组、类、接口
其中数组可以看成一种对象
String类是final类,不可以被继承
Java中的值传递(call by value)和引用传递(call by reference):
值传递不可以改变原变量的内容和地址;
引用传递不可以改变原变量的地址,但可以改变原变量的内容;
但是,
Java语言中只有按值传递。但是Java方法参数中有两种类型:基本数据类型和对象引用。
当一个对象实例作为一个参数被传递到方法中,参数的值就是对该对象的引用。对象的属性可以在被调用过程中该百年,但对对象引用的该百年是不会影响调用者的
一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
一个方法可以改变一个对象参数的状态
一个方法不能让对象参数引用一个新的对象
关键字总结:
True,false是boolean常量,null是null常量,不是关键字
Const和goto是保留关键字
Java中关键字全部都是小写的
Final关键字:
用于修饰属性,方法和类。分别表示属性不可变,方法不可覆盖,类不可被继承。
- 修饰基本类型的变量,一旦对该变量赋值之后,就不能重新赋值了。但是对于引用类型变量,他保存的只是引用,final只能保证引用类型变量所引用的地址不改变,但不保证这个对象不改变,这个对象完全可以发生改变
- 修饰方法,方法不可被重写,但是还是可以重载
- 修饰类,类不可继承,所以方法都不能被重写。
- 修饰参数,用来表示这个参数在这个方法内部不允许被修改
Super关键字:
目的:告诉子类,当前的属性或方法来源于父类
作用:表示当前类父类对象的引用
用法:1.可以调用父类的属性或方法
2.super.属性名称/super.方法名称(参数列表)
3.super可以出现在子类构造方法的第一句代码,表示子类中的构造方法
Static关键字:
- Static成员变量:
Java中没有全局概念,但可以通过static关键字达到全局效果。Static不能修饰局部变量。成员变量:static修饰的静态变量和无static修饰的实例变量
Static修饰的静态变量只要被类加载,这个静态变量就会被分配空间(类.静态变量 / 对象.静态变量),所有该类对象都共享这个静态变量 - Static成员方法:
Static方法不需要被创建就可以被调用。Static方法中不能使用this和super关键字,不能调用非静态方法,只能用过对象调用非静态成员变量和成员方法。 - Static代码块:
静态代码块在类中独立于成员变量和成员函数。JVM在加载类时会执行static代码块 - Static内部类:
可以不依赖外部类实例对象而被实例化。静态内部类不能与外部类有相同的类名,不能访问外部类的普通成员变量,只能访问外部类的静态成员和静态方法。
This关键字:
用来执行当前实例对象
作用:用来区分对象的成员变量与方法的形参。比如构造方法中的默认使用。
synchronized 关键字:
当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
Synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,可以用synchronized(对象){…}定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符
类的加载顺序:
- 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
- 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
- 父类非静态代码块(包括非静态初始化块,非静态属性)
- 父类构造函数
- 姿态非静态代码块(包括非静态初始化块,非静态属性)
- 子类构造函数
方法重写实现多态问题:
即子类覆盖父类方法问题。例如:Base b = new Special();
声明是Base,实现是Special类,可以理解为b在编译时表现为Base类特性,运行时表现为Special类特性。当子类覆盖了父类的方法后,即父类的方法被重写
Object类方法:
hashCode、equals、toString、getClass、clone、finalize、wait、notify、notifyAll
wait():
notify():唤醒一个正在等待该对象的线程
notifyAll():唤醒所有正在等待该对象的线程
getClass()返回当前运行的类
getName()返回的是:包名+类名
Collection总结:
- Collection是对象集合,有两个子接口List和Set:
List可以通过下标取值,值可以重复,Set只能通过游标取值,值不可以重复 - ArrayList,Vector,LinkedList是List的实现类;
ArrayLsit线程不安全,Vector线程安全,这两个类由数组实现;
LinkedList线程不安全,底层由链表实现 - Map是键值对集合:
HashTable和HashMap是Map的实现类
HashTable线程安全,不能存储null值
HashMap线程不安全,可以存储null值
线程安全的集合类:vector,stack,hashtable,enumeration
解释型语言和编译型语言的区别:
C/C++:编译型语言,源码一次编译之后,直接生成了机器码
Java:解释型语言,源码第一个编译后,会生成中间码(字节码bytecode),然后解释器执行字节码,生成机器码
重载与重写
重载:
定义:在同一个类或与它的子类中,方法名相同而参数列表不同。(参数列表不同指的是参数的数量,类型,类型的顺序这三种至少一种不同)
注意:方法重载与返回值类型和访问修饰符无关
重写:
原因:父类的功能无法满足子类的需求
前提:必须存在继承关系
定义:在继承关系中,子类定义与父类相同的方法
原则:
“三同”:即方法名相同,形参列表相同;
“一小”:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等;
“一大”:子类方法的访问修饰符应比父类方法更大或相等。
注意:
1.构造方法不能被重写(构造方法必须与当前类名相同)
2.private修饰的方法不能被重写
3.static修饰的方法不能被重写
4.final修饰的方法不能被重写
重载是编译时期的活动,重写是运行时期的活动
问:为什么不能根据返回类型来区分重载?
因为调用时不能指定类型信息,编译器不知道你要调用哪个函数。函数的返回值只是作为函数运行之后的一个“状态”,它是保持方法调用者与被调用者进行通信的关键,并不能作为某个方法的标识。
+ 运算符:
在Java中,“+”和“+=”是经过重载的运算符,而Java不允许程序员进行运算符的重载。若String先出现,则其后的int统一当作String拼接,若int先出现,先执行运算
== 运算符:
== 可用于基本类型和引用类型:
当用于基本类型的时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同,比较的是地址
基本型和基本型封装型进行 == 运算符的比较,基本型封装型会自动拆箱变为基本型之后再进行比较
两个integer类型进行 == 比较,如果值在-128到127之间,返回true,否则返回false
两个基本型的封装型进行equals()比较,首先equal()会比较类型,如果类型相同,则继续比较值,如果值相同,返回true
Integer的取值范围时-128 到127之间
当我们给一个Integer赋予一个int类型的时候,会调用Integer的静态方法valueOf方法,即Integer i = 127 可以翻译为:Integer i = Integer.valueOf(127),当Integer赋予的int数值在-128到127之间的时候,直接从cache中获取,这些cache引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i)这个地址是新的地址
补码的计算方法:
-n=~n+1 所以 ~n=-n-1
移位运算符:
<<: 左移运算符,num<<n,相当于num乘以2的n次方
>>: 右移运算符,num>>n,相当于num除以2的n次方
>>>: 无符号右移,忽略符号位,空位都以0补齐
数据类型的转换:
将字符串转换为基本数据类型:
调用基本数据类型对应的包装类中的方法parseXXX(string)或valueOf(String)即可返回相应基本类型
将基本数据类型转换为字符串:
一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串,另一种方法是调用string类中的valueOf()方法返回相应字符串
网友评论