10、final、static

1、final关键字

final关键字,表述为“最终的,不可更改的”用来修饰类、方法和变量。

特点:

1) final修饰的类不能够被继承(final类不可以派生子类);

2)修饰的方法不能被重写;

3)修饰的变量为常量,不可修改。

final关键字修饰的变量,称为常量——常量名称建议都为大写用下划线隔开1)修饰基本数据类型,变量的值不能被改变

2)修饰引用类型(对象),该对象的引用(内存地址)不能被改变,即对其初始化之后便不能再让其指向另一个对象,栈上的值不能修改,堆上的值可以修改。

2、static关键字

static关键字,表述为“静态的,全局的”,被static修饰的资源(变量或方法),可以直接通过类名调用,而不需要实例化对象

static 修饰的资源 方便在没有创建对象的情况下来进行调用(方法或变量)

特点:

1、static是一个修饰符,用于修饰成员。(成员变量,成员方法)static修饰的成员变量 称之为静态变量或类变量。

2、static修饰的成员被所有的对象共享。

3、static优先于对象存在,因为static的成员随着类的加载就已经存在。

4、static修饰的成员多了一种调用方式,可以直接被类名所调用,也推荐用这种方式(类名.静态成员)

5、static修饰的数据是共享数据,对象中的存储的是特有的数据。

成员变量和静态变量的区别:

1、生命周期的不同:

成员变量随着对象的创建而存在随着对象的回收而释放。

静态变量随着类的加载而存在随着类的消失而消失。

2、调用方式不同:

成员变量只能被对象调用。

静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

3、别名不同:

成员变量也称为实例变量。

静态变量称为类变量。

4、数据存储位置不同:

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

使用时需注意:

1、静态方法只能访问静态成员。(非静态方法既可以访问静态,又可以访问非静态)

2、静态方法中不可以使用this或者super关键字。

3、主函数是静态的

JVM的类加载顺序

static声明的静态资源 优先于 new 构造方法constructor

static 顺序

父类静态变量

父类静态代码块

子类静态变量

子类静态代码块

---------------------- 类加载分隔线 ---------------------------

父类普通变量

父类普通代码块

父类构造函数

子类普通变量

子类普通代码块

子类构造函数

public class Man {

static {

System.out.println(" man static");

}

public Man() {

System.out.println(" man constructor");

}

}

public class Kid extends Man{

static {

System.out.println(" kid static");

}

public Kid() {

System.out.println(" kid constructor");

}

public static void main(String[] args) {

Kid kid = new Kid();

}

}

特点

1) static声明的资源只能被初始化一次(在类被JVM加载时);

2) 修饰变量,称为静态变量,局部变量(如方法中的变量)不能被static 修饰,因为static就有全局的意思;

3) 修饰方法,称为静态方法,静态方法只能调用其他静态资源,不能调用非静态变量,不能应用this和super,因为静态资源的加载先于实例化;

4) 被static修饰的变量和方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被该类的所有实例共享

5) 修饰内部类(静态类),外部类不需要实例化,可以直接通过外部类名调用

public class Man {

//静态变量

public static int no;

//静态方法

public static void speak(String str) {

System.out.println(str);

}

//主方法

public static void main(String[] args) {

//调用静态变量

Man.no = 12;

//调用静态方法

Man.speak("hello");

}

}

补充:

1. 实例方法和所属的实例绑定

解释:

同一个类中的各个对象都有各自的方法,互相没关系,互不影响。

2. 静态(static)方法和所属的类绑定

解释:

静态方法不会在实例化创建对象时,为对象创建一个新的static方法,所有的对象公用一个static方法,即多个实例对象先后调用该静态方法,只保存最后一次的结果。

3. 静态块

解释:

对静态变量进行初始化,每个静态代码块只会执行一次。

由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。 如果类中包含多个静态代码块,那么将按照“先定义的代码先执行,后定义的代码后执行”。

注意:

1) 静态代码块不能存在于任何方法体内

2) 静态代码块不能直接访问实例变量和实例方法。

内部类

在类中定义的类称为内部类。分为:普通内部类,静态内部类,局部内部类,匿名内部类

public class Outer {

String name;

//内部类

class Inner {

String name;

Integer age;

}

//静态内部类

static class Inner2{

}

public static void main(String[] args) {

Outer out = new Outer();

Inner inner = out.new Inner();

Inner2 inner2 = new Outer.Inner2();

//局部内部类

class Inner3 {

String name;

}

Inner3 innser3 = new Inner3();

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值