***重要***
代码块
定义:使用{}定义的一段代码
根据代码块出现的位置以及关键字不同,分为以下四类代码块
-
普通代码块
定义在方法中代码块,了解即可(作用域不同)
-
构造块(***重要***)
定义在类中的代码块(不加任何修饰符)
当有对象产生时,构造块优先于构造方法执行,产生几个对象,就调用几次构造块
作用:在构造方法执行之前进行一些初始化操作
范例:
class Person{
{
System.out.println("1.Person类的构造块");
}
public Person(){
System.out.println("2.Person类的构造方法");
}
}
public class Test{
public static void main(String[] args) {
new Person();
new Person();
}
}
//1 2 1 2
-
静态代码块
作用:在类中使用static定义的代码块
1.非主类的静态代码块
静态代码块在类加载(主方法中使用)时被调用,优先于构造块,不管产生多少实例化对象,只会被调用一次
范例:
class Person{
{
System.out.println("1.Person类的构造块");
}
public Person(){
System.out.println("2.Person类的构造方法");
}
static{
System.out.println("3.Person类的静态块");
}
}
public class Test{
public static void main(String[] args) {
System.out.println("--start--");
new Person();
new Person();
System.out.println("--end--");
}
}
//s 3 1 2 1 2 e
2.主类中的静态代码块 (***重要***)
主类中的静态代码块优先于主方法执行
范例:
public class Test{
{
System.out.println("1.Test的构造块");
}
public Test(){
System.out.println("2.Test的构造方法");
}
static {
System.out.println("3.Test的静态块");
}
public static void main(String[] args) {
System.out.println("--start--");
new Test();
new Test();
System.out.println("--end--");
}
}
//3 s 1 2 1 2 e
-
同步代码块(多线程同步再讲)
关于代码块面试题(重要):
class Person{
{
System.out.println("1.Person类的构造块");
}
public Person(){
System.out.println("2.Person类的构造方法");
}
static{
System.out.println("3.Person类的静态块");
}
}
public class Test extends Person{
public Test(){
System.out.println("4.Test类的构造方法");
}
{
System.out.println("5.Test类的构造块");
}
static{
System.out.println("6.Test类的静态块");
}
public static void main(String[] args) {
System.out.println("--start--");
new Test();
new Test();
System.out.println("--end--");
}
}
//6 s 3 1 2 5 4 1 2 5 4 e false
//3 6 s 1 2 5 4 1 2 5 4 e true
测试结果如下:
3.Person类的静态块
6.Test类的静态块
--start--
1.Person类的构造块
2.Person类的构造方法
5.Test类的构造块
4.Test类的构造方法
1.Person类的构造块
2.Person类的构造方法
5.Test类的构造块
4.Test类的构造方法
--end--
2.继承-无须重写原有类代码的基础上,就拥有原有类所有属性与方法,对原有类进行功能上的扩展
套用 is a
主要作用:继承强调可重用
定义了一个person类,里边有姓名,年龄,地址等信息,又第一一个student类,同样里边包含了姓名,年龄等信息,这里的student属于person类,直接就可以继承person类
子类(派生类)
父类(超类,基类)
class 子类 extends 父类
继承的限制:
a.子类实例化前先调用父类构造方法,产生父类对象后再调用子类构造(***重要***)
b.Java只允许单继承,不允许多继承,允许多层继承
c.在进行继承的时候,子类会继承父类的所有结构(包含私有属性,构造方法,普通方法) (***重要***)
显示继承(可以直接调用):父类中的所有非私有操作
隐式继承,可以继承(必须通过其他形式调用,getter与setter,不能直接调用):父类中的所有非私有操作 private只允许本类使用
范例:显示继承与隐式继承
如上所示,父类中属性的确被子类继承,但是在子类中只能使用非私有操作
3.方法覆写(***重要***)--override
覆写概念:发生在有继承关系的类之中,子类定义了与父类完全相同的方法(返回值,参数列表,方法名全一样)。被覆写的方法不能拥有比父类更为严格的访问控制权限
范例:简单的覆写
访问控制权限:子类的覆写方法大于等于父类的方法权限
方法覆写不能出现private.隐式继承方法无法被覆写 (***重要***)
判断当前方法调用的是哪个类的方法:(***重要***)
a.当前使用的对象是通过哪个类new的
b.调用的方法是否被子类所覆写,如果被覆写,则调用的一定是子类所覆写的方法
private-私有访问<default(啥也不写)-包访问权限<public(共有访问权限)
解释方法重载(overload)与方法重写(override)的区别 (***重要***)-- Java常考面试题(灰常重要)
-
概念:重载:方法名称相同,参数的类型以及个数不同。覆写:方法名称,返回值,参数类型以及个数完全相同。
-
范围:重载:在一个类中。覆写:继承关系。
-
权限要求:重载:没有权限要求。覆写:被覆写的方法不能拥有比父类更为严格的访问控制权限
例如:现在已经接触了三种访问控制权限:private<default<public。那么也就意味着如果父类使用public进行方法声明,那 么子类必须也使用public;如果父类使用default,那么子类可以使用default或者public。
假如父类中使用private定义方法,子类中使用public覆写,会出现什么情况?
范例:父类使用private定义的方法,子类中使用public覆写