zoukankan      html  css  js  c++  java
  • JAVA基础知识点整理(三)

    this关键字

    如果存在名称相同的成员变量与局部变量时,在方法内部默认优先访问局部变量(就近原则),如果需要访问成员变量,则可以通过this关键字

    (1)引用本类的属性---this.属性名

    (2)调用本类的方法---this.方法名()

    (3)调用本类的构造方法---this()

    JAVA中代码块执行顺序

    父类静态变量--》父类静态代码块--》

    子类静态变量--》子类静态代码块--》

    父类非静态变量--》父类非静态代码块--》父类构造方法--》

    子类非静态变量--》子类非静态代码块--》子类构造方法

    static关键字的特点

    (1)static关键字可以用于修饰属性,方法,代码块,类

    (2)静态成员又叫类成员,非静态成员又叫实例成员

    (3)静态成员在内存中只有一份,被多个对象共享使用

    (4)静态成员在类加载时创建,此时还没有任何对象产生,所以天然就是线程安全的

    【注意1】静态方法中只能访问静态成员,不能访问实例成员,否则会报错   以前的自定义函数都加上了static关键字,否则都需要创建出对象才能调用
        
        Cannot make a static reference to the non-static field
        Cannot make a static reference to the non-static method
        
        原因---静态方法可以使用类名直接调用的,此时可能还没有任何对象,而实例成员要求一定有对象存在,相互矛盾

    【注意2】实例方法中既可以访问实例成员,也能访问静态成员

        原因---实例方法只能由对象调用,说明此时对象已经存在了,而静态成员早已在类加载时存在了,所以可以访问

    【注意3】静态方法中不能出现this关键字和super关键字

        Cannot use this in a static context

        原因---静态方法可以使用类名直接调用的,无需对象的存在,而this和super都离不开对象的存在

    【注意4】静态方法表示类的特有功能,其实现不依赖于具体对象,也不依赖于它的子类,所以静态方法必须自己提供实现,所以static和abstract是不可能共存的

    静态变量和实例变量的区别

    (1)位置和生命周期不同

       静态变量---加载类时,在全局代码区分配空间,随着类的卸载而销毁,与是否存在对象实例无关

       实例变量---创建对象时,在堆区分配空间,随着对象的销毁而销毁

    (2)数量不同

       静态变量---全局唯一,只有一份,每个对象共享使用

       实例变量---每个对象内部各自一份,内容互不相同

    (3)调用格式不同

       静态变量---可以使用类名.或对象名.的形式调用,推荐使用类名

       实例变量---必须使用对象名.的形式调用

    类的生命周期

    (1)类首次使用时,JVM将类的字节码文件加载到内存

    (2)程序退出时,JVM将类的字节码从内存中清除

    对象的生命周期

    (1)对象被new关键字创建出来时,对象出现在堆区

    (2)对象没有任何引用变量关联时,该对象变为垃圾对象,垃圾回收器会在适当的时候将其从堆区清除

    创建对象的四种方式

    (1)使用new关键字创建对象  最常用

    (2)利用反射机制           调用Class.forName()方法返回和类相关联的Class对象,再调用newInstance()方法创建类的一个新实例    在Servlet容器和开源框架中经常使用

    (3)利用对象克隆技术       调用Object类的clone()方法

    (4)利用反序列化技术       IO流中的ObjectInputStream和ObjectOutputSteam

    继承的使用细节

    (1)Java只支持单一继承,即一个类只能有一个父类,一个父类可以有多个子类,构成继承树结构  

       如 JDK中Object类是所有类的顶级父类  Throwable是异常体系的父类  InputStream是输入字节流的父类

    (2)子类不仅可以继承父类非私有的属性和方法,还能增加新的属性和方法,从而起到扩充类功能的作用

    (3)子类可以修改父类中已存在的方法的定义,这个操作叫方法重写(override),重写在多态中起到非常重要的作用,是多态的必要条件

    (4)子类可以定义一个和父类同名的属性,根据就近原则,程序访问不到父类的属性,只能访问到子类的属性,这种现象叫属性的隐藏    不常用

    (5)父类私有的成员不能被继承,因为private属性只有类内部才能访问,如果需要访问父类的成员,访问权限修饰符应设置为protected的

    (6)父类的构造方法不能被继承,因为父子类名根本就不同,但可以通过super关键字调用父类的构造方法

    super关键字---代表父类对象的引用

    (1)引用父类属性---super.属性名

    (2)调用父类方法---super.方法名()

    (3)调用父类构造方法---super()

    super的使用细节

    (1)创建子类对象时,如果子类的构造方法中没有指定调用父类的构造方法,则编译器会在子类构造方法的首行自动加上super(),即调用父类的无参构造方法

      如果显式调用父类的构造方法,则super语句要放在子类构造方法的首行

    (2)super与this不能同时出现在同一个构造方法中调用其它的构造函数,因为这两个语句都需要放在首行

       如果调用的是普通方法,则可以放在任意位置

    this和super的区别

    相同点1---this和super只有在对象存在的前提下使用,不能在静态方法中使用

    相同点2---this和super在调用构造方法时,只能放在首行,调用普通方法时,可以放在任意位置


    不同点1---this代表当前对象,super代表当前对象的父对象

    不同点2---this无需存在继承关系也能使用,super必须存在继承关系才能使用

    方法重载和方法重写的区别

    (1)方法重载(overload)发生在同一个类内部,多个方法具有相同的方法名,方法参数的个数,类型,或排列顺序不同,与返回类型,参数名,访问修饰符无关
       方法重载用于简化类中多个完成相同功能的方法的命名和调用

    (2)方法重写(override)发生在父子类之间,父子类的方法原型必须完全相同,包括方法名,参数名称,个数,类型,顺序
       方法重写用于子类改写或扩充父类方法的功能

    不能被子类重写的四种方法

    (1)private方法---不能被子类继承,也不能被子类重写    //因为private属性只有类内部才能访问

    (2)构造方法---不能被子类继承,也不能被子类重写,但子类可以使用super调用父类的构造方法   //因为父子类名不同,构造方法名也必然不同

    (3)final方法---能被子类继承,但不能被子类重写

    (4)static方法---能被子类继承(隐藏),但不能被子类重写

    final关键字

    (1)修饰基本类型变量时,该变量赋值后不能再被修改,相当于常量

    (2)修饰引用类型变量时,该变量不能再指向新的对象,但是对象本身的内容可以改变

    (3)修饰类的实例变量时,可以在定义变量时,也可以在构造方法中赋值
       修饰类的静态变量时,只能在定义变量时赋值

    (4)修饰类的方法时,该方法不能再被子类重写---最终方法

    (5)修饰类时,该类不能再被子类继承---最终类  如String类

    (6)修饰方法形参时,该形参在此方法中不能被修改

    (7)final不能用来修饰构造方法

  • 相关阅读:
    博客园设置简约主题
    day25-48
    day1-10
    drf app
    flask 框架 练习
    vue入门 显示数据 操作属性 操作样式 条件渲染
    flask 配置文件 路由 视图 模板 中间件
    flask 使用数据库连接池
    Android 工程中添加依赖
    apk反编译
  • 原文地址:https://www.cnblogs.com/sheng-se/p/14377403.html
Copyright © 2011-2022 走看看