Java语法
1.字符串常量和字符型常量区别
形式:字符常量是单引号引起的一个字符;字符串常量是双引号引起的若干个字符
含义:字符型常量相当于一个整型值,可以进行表达式运算;字符串常量是一个地址值,就是该字符串在内存中存放位置
占内存大小:字符型常量占2个字节;字符串常量占若干字节
注:char在Java中占两个字节
Java确定每种基本类型所占存储空间的大小
char 2字节 short 2字节 int 4字节 long 8字节
byte 1字节 float 4字节 double 8字节
2.标识符和关键字
标识符就是一个名字,对于一些标识符,Java语言赋予了特殊含义,这种特殊的标识符就是关键字。
关键字是被赋予特殊含义的标识符。
3.Java泛型,类型擦除,常用的通配符
Java泛型是JDK5中的新特性,泛型提供了编译时类型安全检测机制,该机制允许编译时检测到非法的类型。
泛型的本质:参数化类型,即所操作的数据类型被指定为一个参数。
Java的泛型是伪泛型(在编译期间,所有的泛型信息都被擦掉——类型擦除)
泛型有三种使用方法:泛型类,泛型接口,泛型方法
1.泛型类
//T,E,K,V等参数常用于表示泛型
public class Text<T>{
private T key;
public Text(T key) this.key=key;
public T getKey() return key;
}
//在实例化泛型类时,必须指定T的具体类型
//实例化泛型类:
Text<Integer> I=new Text<Integer>(23233);
2.泛型接口
public interface Text<T>{
public T method();
}
//实现泛型接口,不指定类型:
class TextImpl<T> implements Text<T>{
public T method(){
return null;
}
}
//实现泛型·接口,指定类型:
class TextImpl<T> implements Text<String>{
public String method(){
return "23233";
}
}
3.泛型方法
泛型的通配符:T,E,K,V,?
?是不确定的java类型
T(type)是具体的一个java类型
K,V (key,value)代表java的键,值
E(element)代表元素
public static <E> void prin( E[] inputArray){
for(E element:inputArray){
System.out.print("%s",element);
}
System.out.println();
}
//创建不同类型的数组
Integer[] arr={2,3,3};
String[] arrs={"23","233"};
prin(arr);
prin(arrs);
4.==与equals
==的作用:判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。
注:基本数据类型比较的是值,引用数据类型比较的内存地址
(java只有值传递,对于= = ,基本数据类型和引用数据类型,都是比较值)
equals()的作用:判断两个对象是否相等。不能用于比较基本数据类型的变量。该方法存在于Object类中,而Object类是所有类的直接或间接父类。equals()的方法有两种使用情况:
1.类没有覆盖equals()方法,通过equals()比较该类的两个对象时,等价于用= = 来比较这两个对象。使用的是默认的Object类的equals()方法。
2. 类覆盖了equals()方法,若两个对象的内容相等,则返回true,认为这两个对象相等。
注:
String中的equals方法是被重写过的,因为Object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值;
创建String类型的对象时,JVM在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋值给当前引用,如果没有就在常量池中重新创建一个String对象。
5.hashCode()和equals()
重点:
为什么重新equals时必须重写hashCode方法?
如果两个对象相等,则hashCode一定也是相同的。而两个对象相等,对两个对象分别调用equals方法都是返回true;两个对象有相同的hashCode值,两个对象也不一定是相等的。所以,equals方法被覆盖过,则hashCode方法也必须被覆盖。
补充:hashCode()默认对堆上的对象产生独特值,没有重写该方法,则class的两个对象无论如何不会相等。
hashCode
- 介绍
作用是获取哈希码,也被称做为散列码。实际上是返回一个int的整数。该哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object类中,意味着Java中的任何类都包含了该函数。 - HashSet如何检查重复?
当把对象加入到HashSet时,它先会计算对象的hashcode值来判断对象加入的位置,同时会与其他加入过的对象的hashcode值作比较,没有相同的hashcode值,则HashSet假设对象没有重复。如果有相同的hashcode值的对象,会调用equals()方法来检查hashcode相等的对象是否真的相同,如果相同不让其加入操作成功,如果不同,重新散列到其他位置。 - 为什么两个对象有相同的hashcode值,他们也不一定相等?
hashcode()使用的杂凑算法可能会让多个对象传回相同的杂凑值。而上一个问题的hashset在对比的时候,同样的hashcode有多个对象,它会使用equals()来判断是否真的相同。即hashcode是用来缩小查找成本的。
6.基本数据类型
有八种基本数据类型:
6种数字类型:byte,short,int,long,float,double
1种字符类型:char
1种布尔型:boolean
自动装箱和拆箱
装箱:将基本类型用它们对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型
8种基本类型——常量池
基本类型的包装类大部分实现了常量池技术
默认创建数值[-128-127]的相应类型的缓存数据:Byte,Short,Integer,Long
character创建了数值在[0,127]范围内的缓存数据
Boolean返回True 或者 False
两种浮点数类型的包装类Float,Double没有实现常量池技术
7.方法的返回值
获取某个方法体中的代码执行后产生的结果。返回值的作用是接收出结果,使它可以用于其他操作。
8.Java中只有值传递
按值调用表示方法接收的是调用者提供的值
按引用调用表示方法接受的是调用者提供的变量地址
总的来说,在程序设计语言中,一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java程序设计语言采用按值调用。方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。
总结(java中方法参数的使用):
- 一个方法不能修改一个基本数据类型的参数
- 一个方法不能让对象参数引用一个新的对象
- 一个方法可以改变一个对象参数的状态
9.重载和重写
重载:同样的一个方法能够根据输入数据的不同,做出不同的处理
重写:子类继承自父类的相同方法,输入的数据是一样的,但是响应或者说方法中的内容不同的时候,就需要覆盖父类方法。
重载
发生在编译期,同一个类中,方法名相同;参数类型,个数,顺序不同,方法返回值和访问修饰符可以不同。
重写
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
- 返回值类型,方法名,参数列表相同;抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,访问修饰符范围大于父类。
- 父类方法访问修饰符为private/final/static,则子类就不能重写该方法, 但是被statici修饰的方法可以被再次声明
总结:重写是子类对父类方法的重新改造,外部样子不变,但是内部逻辑可以改变。
区别 | 重载 | 重写 |
---|---|---|
范围 | 同一个类 | 子类中 |
参数 | 必须修改 | 一定不修改 |
返回类型 | 可修改 | 一定不修改 |
异常 | 可修改 | 可以减少或删除,一定不能抛出新的或更广的异常 |
访问修饰符 | 可修改 | 一定不能更严格(可降低) |
发生阶段 | 编译期 | 运行期 |
10.深拷贝和浅拷贝
- 浅拷贝:
对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝 - 深拷贝:
对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容