
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
对于基本类型final使其数值不变
对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
2.方法被final修饰的方法不能被子类重写。private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。因为被private修饰的方法外部无法访问。
3.类声明类不允许继承
static 1.静态变量静态变量:又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。
实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
public class StaticTest {
static int x = 9;//静态变量
int y = 9;//实例变量
}
static修饰的变量可以直接通过类名来调用,没有被static修饰的通过创建对象来调用
public class StaticTest {
static int x = 9;
int y = 9;
public static void main(String[] args) {
StaticTest staticTest = new StaticTest();
int y = staticTest.y;
int x = StaticTest.x;
}
}
但是要注意,被静态修饰的变量在内存中只存在一份,无论你new了几个对象,如果要对static修饰的变量修改的话修改的是同一个值
这是我写的一个Dog类
public class Dog {
static String name;//被static修饰
int age;
public static String getName() {
return name;
}
public static void setName(String name) {
Dog.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog的名字和年龄为:" +"name=" + name+
','+"age=" + age;
}
}
在main函数里执行以下代码你会发现最后输出的名字都一样
Dog dog1 = new Dog();
dog1.setAge(3);
dog1.setName("大黄");
Dog dog2 = new Dog();
dog2.setAge(4);
dog2.setName("大黑");
Dog dog3 = new Dog();
dog3.setAge(5);
dog3.setName("大紫");
System.out.println(dog1);
System.out.println(dog2);
System.out.println(dog3);
这是因为在Dog类里名字被static修饰是唯一的,所以在内存里只有一份,无论有几个对象修改的name都是同一个name。
输出结果
2. 静态方法 静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法。简单理解就是抽象类里如果用static‘修饰方法的话必须实现,因为在子类实现该抽象类里的方法的时候会无法找到被static修饰的方法。
• static方法可以使用对象调用,也可以直接用类名调用,建议用类名直接调用
• 在static方法内部只能访问类的static属性,不能访问类的非static属性,static属性先加载。
public abstract class methonds {
public static void function(){
//do something
}
//abstract和static不可以修饰交通一个方法
}
只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字,因为这两个关键字与具体对象关联。
public class Test {
static int num;//静态变量
int age; //实例变量
public static void function1(){
int a = num;
// int b = age; //非静态变量无法在静态方法中调用
// int c= this.num; //在static修饰的方法中不能有this和super关键字,因为这两个和具体对象关联
}
public void function2(){
int a = age;
int b = this.num;
}
}
3. 静态语句块
代码块在类中声明,类似一个没有名称的方法体(代码块),代码块分实例块和静态块
实例块:每次创建对象时自动调用
{
//任何符合语法的Java代码
}
静态块:类加载时自动调用,仅一次,与是否创建对象无关。
static {
//任何符合语法的Java代码
}
public class Test {
static{
//静态代码块
System.out.println("静态修饰代码块");
}
{
//代码块
System.out.println("代码块");
}
public static void main(String[] args) {
new Test();
new Test();
new Test();
}
}
输出结果如下
4. 静态内部类非静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能用这个实例去创建非静态内部类。而静态内部类不需要。
public class Test {
static int num;//静态变量
int age; //实例变量
class exampleClass{
}
static class staticClass{
}
public static void main(String[] args) {
//exampleClass exampleClass = new exampleClass();//非静态class无法直接创建
Test test = new Test();
exampleClass example = test.new exampleClass();
staticClass sta = new staticClass();//而static可以直接创建
}
}
5. 初始化顺序
静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
public class Test {
static {
//静态代码块
System.out.println("静态代码块");
}
public Test() {
//构造函数
System.out.println("test 构造函数");
}
{
//实例代码块
System.out.println("实例代码块");
}
public static void main(String[] args) {
new Test();
}
}
输出结果
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)