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不能用来修饰构造方法

posted @ 2021-02-05 14:10  别无所求---  阅读(84)  评论(0编辑  收藏  举报