final、static、匿名对象、内部类、包的声明与访问、代码块

final 修饰符
final 变量:
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
实例
public class Test{
final int value = 10;
// 下面是声明常量的实例
public static final int BOXWIDTH = 6;
static final String TITLE = “Manager”;

public void changeValue(){
value = 12; //将输出一个错误
}
}
final 方法
类中的 final 方法可以被子类继承,但是不能被子类修改。
声明 final 方法的主要目的是防止该方法的内容被修改。
如下所示,使用 final 修饰符声明方法。
public class Test{
public final void changeName(){
// 方法体
}
}
final 类
final 类不能被继承,没有类能够继承 final 类的任何特性。
实例
public final class Test {
// 类体
}

static 修饰符
静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
如下例所示,static修饰符用来创建类方法和类变量。
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}

private static void addInstance() {
numInstances++;
}

InstanceCounter() {
InstanceCounter.addInstance();
}

public static void main(String[] arguments) {
System.out.println(“Starting with " +
InstanceCounter.getCount() + " instances”);
for (int i = 0; i < 500; ++i){
new InstanceCounter();
}
System.out.println(“Created " +
InstanceCounter.getCount() + " instances”);
}
}
以上实例运行编辑结果如下:
Starting with 0 instances
Created 500 instances

静态变量和静态常量以及静态方法的理解
静态变量是用static修饰符修饰的变量,静态常量是static final修饰的变量;
声明和访问权限:
静态变量:必须是成员变量,static不能修饰局部变量。静态成员变量可以通过类名访问,也可以通过对象名进行访问。

静态方法:用static修饰的方法,静态方法可以直接访问静态成员变量而无法直接访问非静态成员变量,智能使用实例化的对象去访问非静态的变量(在非静态方法中可以直接访问静态成员变量和非静态成员变量),同理,静态方法也不能直接访问非静态方法,需要通过实例化的对象去调用非静态的方法。

当方法中有与静态成员变量同名的变量,按照就近原则,如果要访问静态成员变量,则可以使用类名访问。

静态常量:指向了固定不可变的内存空间,但其值可变。
eg: static final String a = new String[]{“abc”};
a[0]=“def”;
这样是可以的

final是唯一能够修饰局部变量的修饰符
用static final修饰的方法不能重写,可以在不实例化对象的情况下访问该方法。

匿名对象:没有名字的对象:

new Car(); //匿名对象其实就是定义对象的简写格式。

Car c = new Car();

c.run();
用匿名对象来书写以上代码:

new Car().run();

匿名对象的使用方法:

1 当对象对方法仅进行一次调用的时候,就可以简化成匿名对象。

如一个 对象需要进行调用方法2次,用匿名对象的

new Car().run()

new Car().run()

这是2个对象分别调用了run(),不是一个对象调用了多方法。

2 匿名对象可以作为实际参数进行传递。

public static void show(Car c)
{
//…
}

show(new Car());

一、内部类的定义

二、什么使用内部类

三、内部类的分类

四、成员内部类

五、局部内部类

六、内部类的实际使用----匿名内部类

一、内部类的定义

在一个类的内部又定义了一个类,里面的这个类就是内部类。

内部类可以定义在外部类的成员位置(与成员变量的位置相同)或局部位置(意思是,把类写在外部类的方法里面)。
二、什么时候使用内部类

一个具体的事物里面还有一个具体的事物。比如汽车中有发动机。

内部类使用的机会不多。

三、内部类的分类
成员内部类:和成员变量处在相同位置上的定义。成员内部类也可以写私有,静态等。

局部内部类。
四、成员内部类

1.将内部类,定义在了外部类的成员位置。

2.成员内部类,可以使用成员修饰符:public、static等。但是一般也不写,因为开发也不怎么用。

3.成员内部类,毕竟是一个类,可以继承,也可以实现接口…

4.调用规则:

      内部类可以使用外部类的成员,包括私有(因为内部类没有出去外部类的范围)。[例1]

      外部类要使用内部类的成员,必须要创建内部类的对象。

Java软件包
包相当于一个文件夹
包名的命名规范:

1.要求包名所有的字母都要小写

2.包名一般情况下,是你的域名倒过来写

一个类名的全名是“包名.类名”,调用时如果在同一个包中,可以不用写类名
访问权限
Public :

Public class Student 说明一个类是public可以使其他包里的类能访问该类

当外部的包想调用类里的成员函数或者成员变量时,同时也要声明为public int age;
Private:

成员变量和成员函数声明为private int age只有在本类中才能被访问,就算在相同包的java文件里也不行,子类也不行。
Default:

默认不写的访问权限,相同包里的类、成员变量和成员函数任意使用。

不相同的包里,不能访问

Protected:拥有和default一样的功能,但是该权限只能修饰成员函数和成员变量

用protected定义了成员变量和成员函数,三种类可以访问:

①该类本身

②和它在同一包中的其他类

③其他包中该类的子类

类的导入(import)

只有public类和接口才能被导入。

如果想要使用的类不在同一个包里,可以导入,导入之后只是写外部包类名名字时不需要加包名了,外部包访问权限还是不变的。

import 包名.类名 可以导入想使用的类

一般可以直接使用 import包名.*直接导入包里的所有类。

Java代码块

一.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种:

1.普通代码块:就是类中方法的方法体
public void xxx(){
//code
}

2.构造块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数执行。 构造块中定义的变量是局部变量。
{
//code
}

3.静态块:用static{}裹起来的代码片段,只会被执行一次(第一次加载此类时执行,比如说用Class.forName("")加载类时就会执行static block),静态块优先于构造块执行。
static{
//code
}

4.同步代码块:使用synchronized(obj){}裹起来的代码块,在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则会导致数据的不一致性。常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁如果被占用了,则阻塞,实现了互斥访问共享资源。而synchronized也是有代价的。一个常见的场景是,一个冗长的方法中,其实只有一小段代码需要访问共享资源,这时使用同步块,就只将这小段代码裹在synchronized block,既能够实现同步访问,也能够减少同步引入的开销。 同步代码块须写在方法中。
synchronized(obj){
//code
}

猜你喜欢

转载自blog.csdn.net/yibanbanba/article/details/82762530
今日推荐