java学习笔记(三)--(对象编程-类与方法下)(代码块&继承&覆写)

***重要***

代码块

    定义:使用{}定义的一段代码

    根据代码块出现的位置以及关键字不同,分为以下四类代码块

  • 普通代码块 

            定义在方法中代码块,了解即可(作用域不同)

  • 构造块(***重要***

            定义在类中的代码块(不加任何修饰符) 

            当有对象产生时,构造块优先于构造方法执行,产生几个对象,就调用几次构造块

            作用:在构造方法执行之前进行一些初始化操作

范例:

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覆写

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值