1关键字
return关键字
作用:①结束方法
②接收有返回结果的方法,用于把数据返回给调用者
return关键字后面不可以声明执行语句。
this关键字
-
this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)
-
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
-
方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
-
可以调用属性和方法和构造器
-
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。
使用场景:当在方法内需要用到调用该方法的对象时,就用this。
使用this访问属性和方法时,如果在本类中未找到,会从父类中查找
可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!调用类中其他构造器时"this(形参列表)"必须放在首行
super关键字
在Java类中使用super来调用父类中的指定操作:
super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造器中调用父类的构造器尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
super的追溯不仅限于直接父类
super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
this和super的区别
this | super | |
访问属性
| 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 直接访问父类中的属性 |
调用方法 | 访问本类中的方法,如果本类没 有此方法则从父类中继续查找 | 直接访问父类中的方法 |
调用构造器 | 调用本类构造器,必须放在构造 器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
static关键字
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
static:静态的,修饰的字段属于类,不属于任何对象
static可以修饰:属性、方法、代码块、内部类
类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
被修饰后的成员具备以下特点:
- 随着类的加载而加载
- 优先于对象存在
- 修饰的成员,被所有对象所共享
- 访问权限允许时,可不创建对象,直接被类调用
非静态变量:创建类的多个对象,每个对象都拥有独立的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的修改
静态变量:创建类的多个对象,多个对象共享同一个静态属性,当修改其中一个对象的静态属性时,会导致其他对象中同样的属性值的修改
静态属性:一般使用静态变量比较少,经常使用静态常量配合final关键字使用
final关键字
在Java中声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”。
final标记的类不能被继承。提高安全性,提高程序的可读性。
- String类、System类、StringBuffer类
final标记的方法不能被子类重写。
- 比如:Object类中的getClass()。
final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。
final标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋值,然后才能使用。
- final double MY_PI = 3.14;
instanceof关键字
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
如果x属于类A的子类B,x instanceof A值也为true。
native关键字
使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++等非Java 语言实现的,并且被编译成了 DLL,由 java 去调用。
(1)为什么要用 native 方法
java 使用起来非常方便,然而有些层次的任务用 java 实现起来不容易,或者我们对程序的效率很在意时,问题就来了。例如:有时 java 应用需要与 java 外面的环境交互。这是本地方法存在的主要原因,你可以想想 java 需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解 java 应用之外的繁琐的细节。
(2)native 声明的方法,对于调用者,可以当做和其他 Java 方法一样使用一个 native method 方法可以返回任何 java 类型,包括非基本类型,而且同样可以进行异常控制。
native method 的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM 将控制调用本地方法的所有细节。
如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用 java语言重写这个方法(如果需要的话)。
2其他特性
==和equals方法的区别
== 可以使用基本数据类型变量和引用数据类型变量中,
如果比较的是基本数据类型变量,比较两个变量保存的数据值是否相等(数据类型不一定一致)
如果比较的是引用数据类型变量,比较两个变量的地址值,即两个引用是否指向同一个对象实体
equals()比较两个对象的内容是否相同
是一个方法,而非运算符
只能适用于引用数据类型
object的equals比较的是引用数据类型的地址值,所以自定义类要重写equlas方法
1 == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
2 equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
3 具体要看自定义类里有没有重写Object的equals方法来判断。
4 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。
包装类
针对八种基本数据类型定义相应的引用类型—包装类(封装类)
有了类的特点,就可以调用类中的方法,基本数据类型才是真正的面向对象
基本数据类型包装成包装类的实例 ---装箱
通过包装类的构造器实现:
int i = 500; Integer t = new Integer(i);
获得包装类对象中包装的基本类型变量 ---拆箱
调用包装类的.xxxValue()方法
JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配。
自动装箱:当执行list.add(3)时,编译器会自动变成list.add(Integer.valuesOf(3));
自动拆箱:int num = list.get(i);会自动转换为int num = list.get(i).intValue();
注意:自动装箱和拆箱是编译器的职责,不是虚拟机,编译器生成class文件时会插入对应的方法,虚拟机来执行class文件
基本数据类型、包装类--->String类型:调用String重载的valueOf(Xxx xxx)
@Test
public void test4(){
int num1 = 10;
//方式1:连接运算
String str1 = num1 + "";
//方式2:调用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);//"12.3"
Double d1 = new Double(12.4);
String str3 = String.valueOf(d1);
System.out.println(str2);
System.out.println(str3);//"12.4"
}
String类型 --->基本数据类型、包装类:调用包装类的parseXxx(String s)
//String类型 --->基本数据类型、包装类:调用包装类的parseXxx(String s)
@Test
public void test(){
String str1 = "123";
//错误的情况:
// int num1 = (int)str1;
// Integer in1 = (Integer)str1;
//可能会报NumberFormatException
int num2 = Integer.parseInt(str1);
System.out.println(num2 + 1);
String str2 = "true";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(b1);
}
Integer一道面试题
@Test
public void test3() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
//保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在
//-128~127范围内时,可以直接使用数组中的元素,不用再去new了。目的:提高效率
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true
Integer x = 128;//相当于new了一个Integer对象
Integer y = 128;//相当于new了一个Integer对象
System.out.println(x == y);//false
}