Java面向对象(三):Java权限修饰符—static关键字
一、权限修饰符
1.1 四类权限修饰符
public 公开的
protected 受保护的
private 私有的
默认的(不写其它修饰符时);
1、public修饰的成员变量,任何人都可以访问,都可以修改,可能导致不安全。
2、private修饰的成员变量为私有属性,只有本身才能去操作相关的信息。
1.2访问控制:当前类修饰的成员变量能否被其他不同类访问
具体参考:权限修饰符:http://www.runoob.com/java/java-modifier-types.html#protected-desc
参考例程:
Pack1:Father.java、 Son.java、 TextFather.java
Pack2:TextFather.java、Son.java
测试代码较多逻辑简单不贴了,另子类继承父类内容参考下一篇博客;
二、 static 关键字
1.1 static修饰成员变量即为静态变量
1、 静态变量与成员变量的区别:
访问方式:成员变量的访问通过创建对象后访问;引用名.成员变量
静态变量的访问可以直接通过类名访问;类名.静态变量,也可用对象的引用名但一般不建议。
存储位置:成员变量存储在堆内存,静态变量存储在方法区。
生命周期:成员变量随对象的创建而创建,对象的消失而消失;
静态变量随类的创建而创建,类的消失而消失;
2、注:静态变量为类下所有对象共有的,它的值决定于最后一次的改变值。成员变量每个对象都有对应的值,彼此不影响(存疑)
3、例程:
Demo1.java
1 package object_static; 2 3 public class Demo1 { 4 5 static String name ; 6 static int age ; 7 int tall ; 8 private int weight ; 9 public void show() { 10 System.out.println("我是非静态的"+name+age+tall); 11 } 12 13 static void staticShow() { 14 System.out.println("我是静态的"+name+age); 15 // System.out.println(tall); 静态方法不能访问非静态的变量 16 } 17 18 }
TextDemo1.java
1 package object_static; 2 /** 3 * 1、对静态变量静态方法的操作 4 * 2、静态变量用 类.变量 来改变,用 引用名.变量 也可以改变但不建议。其值取决于最后一次改变的值, 5 * 在所有的实例中都是一样的。 6 * 7 * */ 8 public class TextDemo1 { 9 public static void main(String[] args) { 10 11 Demo1 demo1 = new Demo1(); 12 Demo1 demo2 = new Demo1(); 13 // demo1.weight = 53; 14 System.out.println(demo1.age); 15 16 System.out.println(Demo1.age); 17 18 //改变静态变量 19 Demo1.age = 3; 20 21 //在所有的实例中都是一样的 22 demo1.age = 34; 23 demo1.tall= 178; 24 demo1.show(); 25 26 //对象调用静态方法 27 demo1.staticShow(); 28 29 //类调用静态方法 30 Demo1.staticShow(); 31 32 demo2.show(); 33 } 34 35 }
1.2 static 修饰成员方法即为静态方法
1、静态方法可直接通过类名访问,类名.静态方法;
2、静态方法只能访问静态变量,不能访问非静态的成员(包括成员变量和成员方法)。
3、main方法即为静态的。
1.3 static 代码块与代码块(掌握)
1、static 代码块
语法:
static{
代码块;
}
2、构造代码块:
语法:
{
代码块
}
3、例程 Demo2.java
1 package object_static; 2 /**** 3 * @author Kanekiyi 4 * 1、static代码块在类加载前就被执行,只执行一次,一般用于视频/音频/图片的加载; 5 * 2、构造代码块只能在创建对象时被调用,创建一次对象执行一次,优先级高于构造函数。 6 * 3、执行优先级:static代码块>构造代码块>构造函数 7 * 8 * */ 9 10 public class Demo2 { 11 12 public static void main(String[] args) { 13 14 Demo2 de = new Demo2(); 15 System.out.println("—————————————————"); 16 17 Demo2 de2 = new Demo2(); 18 19 System.out.println("我是main方法块"); 20 21 22 } 23 24 { 25 System.out.println("我是构造代码块4"); 26 27 } 28 // 静态代码块在所有程序执行之前执行 29 static { 30 System.out.println("我是静态代码块"); 31 } 32 33 public Demo2() { 34 System.out.println("我是无参代码块"); 35 36 } 37 38 // 构造代码块 通过new出来的对象调用,没用引用不会执行,执行优先级仅次于static代码块 39 { 40 System.out.println("我是构造代码块1"); 41 42 } 43 { 44 System.out.println("我是构造代码块3"); 45 46 } 47 48 }
4、总结:
static静态代码块执行的优先级最高,先于类的加载,且只执行一次;一般用去图像、视频、音频等多媒体的加载;
构造代码块必须在创建对象之后才能被访问,在执行构造函数之前就被加载了。每创建一次加载一次;
5、思考题;
static 代码块、构造函数、构造代码块执行的优先级;
static代码块>构造代码块>构造函数