小知识点
- 所有的程序,都要定义在类里面;
- 异常 定义方法时,使用 throws 可以用来捕获方法体内没有捕获的异常,然后以 SomeException 抛出异常
- java是解释型语言。java虚拟机能实现一次编译多次运行。
- JDK(java software Development kit 软件开发包),JRE(java Runtime Environment java运行环境)。
- javac编译java程序,java运行java程序。
- 一个文件最多有一个public class。
- java不提供运算符的重载。
- 建议不要在for 循环体内修改循环变量(也叫循环计数器),否则会增加程序出错的可能性。建议重新定义一个临时变量值,将循环变量值赋值给临时变量;
- 在static方法中不能访问非static的成员。static方法是指在函数前面加上static限定符,如:public static vooid main(String args[]);public static void print();
- static 真正的作用是用于区分成员变量、方法、内部类、初始化块这四种成员属于类本身还是属于实例;
- 类成员不能访问实例成员;
- static 不能修饰构造器,static 修饰的类成员属于整个类,不属于单个实例;
- Java 编程中不要使用对象(实例)去调用 static 修饰的成员变量和方法,而是应该使用类去调用 static 修饰的成员变量、方法;
- this 关键字总是指向调用该方法的对象,static 修饰的方法中不能使用 this 引用;
- 系统不允许 final 变量重新赋值,子类不允许覆盖父类的 final 方法,final 类不能派生子类;
类:
- 类可以认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量;
- 类里各成员(构造器、成员变量
field
、方法)之间的定义顺序没有任何影响,static
修饰的成员不能访问没有static
修饰的成员; - Java 中属性是
property
,指的是一组setter
和getter
方法,比如某个类有 age 属性,意味该类包含setAge()
和getAge()
两个方法; - 修饰符 [public|static|protected] 三者出现其一,[final|abstract] 二者只能出现其一,前面可以和 static 组合使用;
- 构造方法既不能定义返回值类型,也不能使用
void
声明构造器没有返回值,否则会当成方法处理,就不再是构造器; - Java 对象,都是 Object 类的实例,都可以直接调用该类中定义的方法;
- 子类重写父类方法时,有几个原则:
- 重写方法不能比被重写方法限制有更严格的访问级别
- 参数列表必须与被重写方法的相同
- 返回类型必须与被重写方法的返回类型相同
- 重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常
- 不能重写被标识为final的方法
对象引用的理解
Human aPerson = new Human(160);
创建了一个Human类的对象 aPerson。
上面是一个非常简单的表述,但我们有许多细节需要深入:
- 首先看等号的右侧。new是在内存中为对象开辟空间。具体来说,new是在内存的
堆(heap)
上为对象开辟空间。这一空间中,保存有对象的数据和方法。 - 再看等号的左侧。aPerson指代一个Human对象,被称为
对象引用(reference)
。实际上,aPerson并不是对象本身,而是类似于一个指向对象的指针。aPerson存在于内存的栈(stack)
中。 - 当我们用等号赋值时,是将右侧new在堆中创建对象的地址赋予给对象引用。
这里的内存,指的是JVM (Java Virtual Machine)虚拟出来的Java进程内存空间
public class Demojava {
public static void main(String[] args) {
String name1 = "michael";
String name2 = "michael";
String name3 = new String("michael");
System.out.println("name1: " + name1);
System.out.println("name2: " + name2);
System.out.println("name3: " + name3);
System.out.println("name1 equal name2: " + name1.equals(name2));
System.out.println("name1 == name2: " + (name1 == name2));
System.out.println("name1 equal name3: " + name1.equals(name3));
System.out.println("name1 == name3: " + (name1 == name3));
System.out.println("name1 hashcode: " + name1.hashCode());
System.out.println("name2 hashcode: " + name2.hashCode());
System.out.println("name3 hashcode: " + name3.hashCode());
System.out.println("name1 identityhashcode: " + System.identityHashCode(name1));
System.out.println("name2 identityhashcode: " + System.identityHashCode(name2));
System.out.println("name3 identityhashcode: " + System.identityHashCode(name3));
System.out.println("End");
}
}
Out:
name1: michael
name2: michael
name3: michael
name1 equal name2: true
name1 == name2: true
name1 equal name3: true
name1 == name3: false
name1 hashcode: 1054337575
name2 hashcode: 1054337575
name3 hashcode: 1054337575
name1 identityhashcode: 366712642
name2 identityhashcode: 366712642
name3 identityhashcode: 1829164700
End
结果分析:
- String 类重写了 equal 和 hashCode 方法,使他们比较时是依据的对象的值;
- Object 类原始的的 equal hashCode 方法效果是和
==
比较方式一样,都是依据对象的内存地址进行处理后比较的; - identityHashCode 方法是依据的对象的内存地址进行处理后比较的;
相关问题:
- 如何记住 string==null 和 string.equals("") 的区别?
- Java语法----Java中equals和==的区别
- hashCode和identityHashCode的区别
- hashCode和identityHashCode的区别你知道吗?
参考:
参考
教程