Java与面向对象的关系:
面向对象是一种使用封装、继承、多态、抽象等思想进行软件的分析和开发的方法,而java就是一门面向对象编程的语言。
面向对象的三个基本特性是:封装、继承、多态。
1.Java中成员变量与局部变量
成员变量是定义在类中的变量,局部变量是定义在一个方法中的变量;局部变量又分为形参和方法内局部变量。
成员变量在定义后无需显示初始化,系统会自动对其进行默认初始化(不用初始化也可输出值);局部变量必须显示赋值才能对其进行访问(未赋值会提示未初始化)。
java允许局部变量和成员变量重名,局部变量会覆盖成员变量的值,一般使用this.变量名表示成员变量。
2.Java中this关键字
Java关键字this只能用于方法方法体内。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。
用法:
用this调用成员属性和方法;
用this调用本类中的其他构造方法,调用时要放在构造方法的首行(this("str"));
同过return this返回这个类的实例对象;
注意this不能再静态方法中使用;
3.子类继承父类执行顺序
在建立的子类和父类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,下面通过代码演示执行顺序:
父类:
package test;
public class FatherClass {
private String name;
public FatherClass() {
System.out.println("父类的无参构造函数");
}
public FatherClass(String name){
this.name=name;
System.out.println("父类有参构造函数");
}
static{
System.out.println("父类的静态代码块");
}
{
System.out.println("父类的非静态代码块");
}
}
在主函数中调用new一个子类的语句 SonCalss Tony=new SonClass();
package test;
public class SonCalss extends FatherClass {
private String name;
public SonCalss() {
System.out.println("子类的无参构造函数");
}
public SonCalss(String name){
this.name=name;
System.out.println("子类的有参构造函数");
}
static{
System.out.println("子类的静态代码块");
}
{
System.out.println("子类的非静态代码块");
}
public static void main(String[] args) {
SonCalss tony=new SonCalss("Tony");
}
}
输出结果为:
父类的静态代码块
子类的静态代码块
父类的非静态代码块
父类的无参构造函数
子类的非静态代码块
子类的有参构造函数
结论:在new 一个子类的对象时,先调用父类的静态代码块,再调用子类的静态代码块,父类的非静态代码块,父类的无参构造函数(无论子类调用的是否是有参还是无参函数),子类的非静态代码块,子类的有参构造函数。
非静态代码块先于构造函数执行,通过new子类的方式只会调用父类的无参构造函数
4.构造函数能被重写吗?
因为构造函数必须与类名一致,而重写是指在子类中重写父类的方法,但是重写要求返回类型和方法名不变,所以构造函数不能被重写。
5.异常和运行时异常
Throwable类是Java异常类型的顶层父类,Error和Exception都是继承自Throwable,Exception分为运行时异常和异常(非运行时异常)。
运行时异常都是RuntimeException类及其子类异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以需要程序员去写一大堆catch块去处理可能的异常。
RuntimeException:ClassCastException(类型转换异常)、IndexOutOfBoundsException(数组越界)、NullPointerException(空指针)、ClassNotFoundException等
Exception:IOException、SQLException等
6.==和equals
对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。
对于equals方法(equals方法不能作用于基本数据类型的变量)如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
7.hashCode()和equals()
equals()相等的两个对象,hashcode()一定相等;反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。