Java学习笔记_17_static、final、abst修饰符

时间:2023-02-26 13:08:43

17.static、final、abst修饰符:

 1>static修饰的变量叫做静态变量:

  · 类中的静态变量属于类,而不属于某个特定的对象。

  · 类的静态成员可以与类的名称一起使用,而不需要创建类的对象。

  · 整个类中静态变量的副本只有一个。

  · 声明为static的变量实质上就是全局变量。 

 2>static修饰的方法叫做静态方法,也叫做类方法:

  · 静态方法只能访问其它的静态方法,不能访问非静态的方法。

  · 静态方法中没有this关键字。

  · 静态方法不能覆盖(重写)为非静态的方法。

 3>静态代码块:

  语法:

       static{//静态代码块

       }

  注意事项:

  · 如果需要通过计算来初始化静态变量,可以声明一个静态块。 

  · 静态块在该类中只被加载时执行一次。

  · 只能初始化类的静态数据成员。

  

  public class StaticTest {
static int[] values = new int[10];
static {
for (int i = 0; i < values.length; i++) {
values[i] = i;
}
}
}

 4>单态设计模式:

  单态设计模式:

      采取一定的方法保证在整个如见系统中,某个类只能存在一个对  

  象示例,并且该类只能提供一个取得其对象示例的方法。

  方法1:(推荐使用更安全)

  

public class TestSingle {
// 前面加上private static final修饰符后只能产生一个对象
private static final TestSingle onlyOne = new TestSingle();

private TestSingle() {
// 不能再类的外部使用new,但可以在类的内部使用
}

// 外面只能通过方法调用获得一个对象
public static TestSingle getTestSingle() {
return onlyOne;
}
}

  方法二:

  

 public class TestSingle {

private static TestSingle onlyOne = null;

public static synchronized TestSingle getonlyOne() {
if (onlyOne == null) {
onlyOne = new TestSingle();
}
return onlyOne;
}
}

5>final修饰符:

 · final修饰的类不能被子类继承。

 · 使用final修饰的方法不能被子类覆盖。

 · 类中一个final修饰的方法只被修饰一次。

 · 如果一个类为final类,那么它的所有方法都为隐士的final方法。

 · 一个变量可以声明为final,这样可以阻止它的内容被修改。

 · 声明final变量以后,变量只能被初始化一次,然后就不能被就改了。

 · 一个final变量实际上是一个常量。

6>abstract修饰符:

 · 修饰的类即为抽象类,不能被示例话。

 · 构造方法和static方法不是抽象的。

 · 父类的抽象方法往往在子类中实现,抽象类可以具有指向子类的对

   象引用。

 · 抽象类的方法可以是具体方法,也可以是抽象方法。但一个类中如

   果有抽象方法那么这个类一定是抽象类,应该在该类前加上abstract 

   关键字来修饰。

   

 abstract class Shape {//抽象类
public double length;
public double width;

public Shape(double length, double width) {
this.length = length;
this.width = width;
}
//抽象方法
public abstract double area();
}

class Rectangle extends Shape {
Rectangle(double num, double num1) {
super(num, num1);
}
//实现父类的抽象方法
public double area() {
return length * width / 2;
}
}

public class TestShape {
public static void main(String[] args) {
Shape sp = new Rectangle(4, 2);
System.out.println(sp.area());
}
}