Java中的关键字

一、super关键字

1).在子类中使用;

2).存储的是"父类的引用";它指向父类对象空间;

3).在子类中,使用super可以访问父类的:成员变量、成员方法、构造方法,但不能访问父类的私有成员

在子类中调用父类成员:

成员变量:

classFu{

intnum = 10;

}

classZi extends Fu{

voidshow(){

System.out.println(super.num);

}

}

成员方法:

classFu{

voidfun1(){

System.out.println("Fu-->fun1()");

}

}

calssZi extends Fu{

voidshow(){

super.fun1();//调用父类的成员方法;

}

}

调用父类的构造方法:

classFu{

}

classZi extends Fu{

Zi(){

super();//调用父类无参的构造方法;

System.out.println("Zi的构造方法");

}

}

4).有一种情况,子类必须显示的使用super()调用父类的构造方法:

当父类没有"无参构造方法"时;

1.当实例化子类对象时,Java回去实例化它的父类-->默认调用父类"无参构造方法";

2.如果父类没有"无参构造方法",那么Java 就没有办法调用;

3.这时,子类必须显示的使用super(),告诉Java编译器,调用哪个带参的构造方法,并传递

  什么样的参数;

5).当使用super调用父类的构造方法时,必须写在这个构造方法的:第一句有效代码;

6)父类的构造方法只能在子类的构造方法中调用,而普通方法可以再子类的任何位置使用super调用

7) 实例化子类对象时,先回去实例化父类对象,在回来实例化子类对象

 

二、this关键字

1).任何类中都可以使用;

2).存储的"本类对象的引用";它指向的本类对象的空间;

3).this可以访问本类对象的:成员变量、成员方法、构造方法

this访问本类成员:

成员变量:

classStudent{

Stringname;

voidshow(){

System.out.println(this.name);

}

}

成员方法:

classStudent{

voidf1(){

}

voidf2(){

this.f1();//调用本类的方法

}

}

构造方法

classStudent{

Student(){

System.out.println("无参的构造方法");

}

Student(intn){

//        Student();//掉用本类其它构造方法。不可以这样调用。

this();//调用本类无参的构造方法;

System.out.println("带参的构造方法");

}

}

4).调用本类其它构造方法使用this()。可以带参数。

  注意:this()语句,必须是这个构造方法的第一条有效语句;

5).this调用成员时先从本类中找们如果本类中没有则到父类中找(如果是赋值操作,就会将值赋给父类成员)

 

 

三、this和super的区别

this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。

1.this:

1).在任何类中使用;

2).存储的是本类对象的引用;

3).可以访问本对象的成员变量、成员方法、构造方法;

2.super:

1).在子类中使用;

2).存储的是父类对象的引用;

3).可以访问父类对象的成员变量、成员方法、构造方法;

 

四、final关键字

1.可以修饰

1).成员变量:此变量拥有最终的值。是一个"常量"。其值是不能被修改的。或者只能被赋值一次;(也分为基本类型和引用类型)

2).成员方法:表示最终的方法。不能被"重写",但可以被调用

3).:表示最终的类;不能被"继承".

4).局部变量

A.普通局部变量:

A-1:修饰基本数据类型:其值不能被更改;

A-2:修饰引用数据类型:其地址不能被更改;

B.方法的形参:

B-1:修饰基本数据类型:其形参的值不能被更改;

B-2:修饰引用数据类型:其形参的地址不能被更改;

 

2、不能在方法中初始化final修饰的成员变量

 

【java中为什么会有final变量】:

   final这个关键字的含义是“这是无法改变的”或者“终态的”;

   那么为什么要阻止改变呢?

   java语言的发明者可能由于两个目的而阻止改变:

   1).效率问题:

       jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,

       用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;

   2). 设计所需:

       众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递;

 

【final关键字的使用方法】:

   【修饰变量】:

       final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

   【修饰方法】:

       final方法不能被子类方法覆盖,但可以被继承。

   【修饰类】:

       final类不能被继承,没有子类,final类中所有方法都是final的。

 

【final的内存分配方式】:

   【修饰变量】:

       通常情况下,final变量有3个地方可以赋值:直接赋值,构造函数中,或是初始化块中。

       【初始化】:

           由于在java的语法中,声明和初始化是联系在一起的,

           也就是说:如果你不显示的初始化一个变量,系统会自动用一个默认值来对其进行初始化。(如int就是0)

           对于final变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,

           如果是静态的,则可以在初始化块。

       【内存】:

            常量(final变量)和非final变量的处理方式是不一样的。

            每一个类型在用到一个常量时,都会复制一份到自己的常量池中。

            常量也像类变量(static)一样保存在方法区,只不过他保存在常量池。

            (可能是,类变量被所有实例共享,而常量池是每个实例独有的。)

   【修饰方法】:

       保存在方法区,并且可以被函数代码直接替换,而不用等到执行时再决定具体是那个函数。

   【修饰类】:

       保存在方法区。

 

【java中变量的初始化顺序】:

    变量的初始化次序优于任何方法,甚至在构造方法的前面。对于static变量也是一样,

    如果变量是原始类型,那么它得到一个标准的原始类型的初始值,

    如果是一个对象的引用,除非你创建了一个新的对象给这个引用,否则就是null。

    static变量在需要的时候才会初始化,并且在这个类的构造函数和所有其他普通变量之前调用,static之后就不再进行初始化了,

    static变量在类初始化时(注意不是实例),就必须分配内存空间,

    static变量单独划分一块存储空间。

 

    java类首次装入时,会对静态成员变量或方法进行一次初始化,

    先初始化父类的静态代码-->初始化子类的静态代码-->

    (创建使历史,如果不创建实例,则后面的不执行)初始化父类的非静态代码-->初始化父类的构造

        -->初始化子类的非静态代码-->初始化子类的构造

 

    类只有在使用new调用创建的时候才会被java类装载器装入。

 

【final方法为何会高效】:

   final方法会在编译的过程中利用内嵌机制进行inline优化。

   inline优化是指:在编译的时候直接调用函数代码替换,而不是在运行时调用函数。

   inline需要在编译的时候就知道最后要用哪个函数,    

   显然,非final是不行的。

   非final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段

   并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。

 

【什么是多态】:

   按字面的意思是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。

   简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

 

【非final方法为什么会出现多态】:

   显然,如果派生出一个子类,覆盖非final方法,就会出现2个这样的方法可供调用,这就是多态。

 

【final变量的变与不变】:

   有人说final变量在赋值后就不可变,

   那么这个不变到底指的是什么呢?

   这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。

   就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。

 

【final关键字的具体应用】:

   【final+变量】:

       在实际应用中,这种形式是非常少见的。

       比如logger是可以的,但是貌似并不是非常实用,或许用户仍然希望通过setter来改变logger变量。

   【static+final+变量】:

       常量。经常使用。

   【final+方法】:

       JDK中常用,但是自己并未常用。

   【final+类】:

       helper类经常使用。

   【final用于匿名内部类的参数传递】:

       在多线程测试时,经常使用。

   【final用于方法的参数】:

       并不常用。

 

五、static关键字

5/1

1、static:静态的——全局的——整个应用程序范围内。

2、有些成员变量具有固定的值,一般不会更改。

如果它作为"普通成员变量":意味着,每次实例化这个对象时,都会在堆中分配空间。所以,如果对象多了后,就会造成"空间浪费";

3、被static关键字修饰后的成员会在方法区开辟一段空间,这段空间会被整个应用程序成员共享,不能被定义为局部变量

4static可以修饰

成员变量:存在静态存储区。被所有对象共享;

成员方法:存在静态存储区。被所有对象共享;

可以修饰内部类(不能修饰外部类)

代码块

static不能修饰局部变量

 

 

5/2 静态属性的应用

1、当有些成员属性的值在整个应用程序方位内是唯一的,而且被整个应用程序共享,此时可以将这个成员在某个类中声明为static的

 

5/3 静态关键字的特点

1、随着类的加载而加载

2、优先于对象而存在,在没有任何此类对象的情况下,就已经存在了

3、被类的所有对象共享,也可以被其他类访问

4、可以通过类名调用,也可以通过对象名调用

 

5/4 static关键字的注意事项

1、在static的方法中,不能使用this关键字

2、静态方法只能访问静态成员变量和静态成员方法

3、普通的成员方法可以访问静态的成员变量和静态的成员方法

 

5/5 静态变量和成员变量的区别

1.所属不同

1/1 静态变量:属于某个类,又叫"类变量"。

1/2 成员变量:属于"对象",每个对象都有独立的成员变量的空间。也叫"实例变量";

2.内存中位置不同:

2/1 静态变量:在方法区的"静态存储区"中;

2/2 成员变量:在"堆"中;

3.在内存中出现时间不同:

3/1 静态变量:第一次使用这个类时,可能还不会产生对象。此时就会为静态变量分配空间;

3/2 成员变量:在实例化类对象时,才会分配空间;

4.调用不同:

4/1 静态变量:可以通过"类名"访问。也可以通过"对象"访问;

4/2 成员变量:必须要通过"对象"访问;

 

六、abstract关键字

abstract关键字可以修饰类和方法,若类中的方法为abstract的,则类一定要是abstract类型的

抽象类具有以下特性: 

1、抽象类不能实例化。

2、抽象方法中可以有成员变量、抽象方法和普通成员方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值