Bootstrap

Java面向对象知识点

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()可能相等,也可能不等。

;