Java学习之内部类、final关键字、static关键字

  • Post author:
  • Post category:java




内部类、final关键字、static关键字


一、内部类


在类中定义的类,有普通内部类,静态内部类和匿名内部类

示例:

public class Man {
	String name;
	Kid kid;
	//内部类
	class Kid{
		String name;
		Integer age;
	}
	//静态内部类
	static class Children{
		
	}
	public static void main(String[] args) {
		Man man = new Man();
		Kid kid = man.new Kid();
	}
}


二、final关键字


表述为“最终不可修改的”,用来修饰类、方法和变量

Final修饰的类不能被继承

Final修饰的方法不能被重写

Final修饰的常量,不可修改

常量

Final关键字修饰常量,常量名必须都是大写,如final string NAME;

1) 修饰基本数据类型,变量的值不能被改变

2) 修饰引用类型(对象),该对象的引用(内存地址)不能被改变,即对其初始化之后就不能让其指向另外的对象

示例:

final int NO = 12;
final String NAME = "abc";


三、static关键字


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

JVM的类加载顺序

static声明的静态资源 > new > 构造方法constructor

特点:

  1. static声明的资源只能被初始化一次;
  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. 静态代码块不能直接访问实例变量和实例方法。

    问题

    父类: 静态块 构造方法

    子类:静态块 构造方法

    子类继承父类,创建子类对象,观察加载顺序

    答案:加载顺序为1父类静态块2子类静态块3父类构造方法4子类构造方法

    示例:
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();
	}
}



版权声明:本文为dgvesrhetd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。