static:
* static静态的,是一个关键字,用来修饰成员变量或者成员方法; * 特点如下:* 1. 被static修饰的成员,属于类成员,是类的一部分. * 2. 被static修饰的成员变量,属于共享数据,一个地方改变了,在另外的地方访问也就变了. * * 修饰成员变量的格式: static 数据类型 变量名; * 修饰成员方法的格式: public static void method(参数){...}package package02static;public class Person {// 成员变量String name;int age;// 静态成员变量static String country = "中国";// 成员方法public void methodNormal(){System.out.println("普通的成员方法");}// 静态成员方法public static void methodstatic(){System.out.println("静态成员方法");}}
* 如何使用static修饰的内容
* 1. 方式一: 使用类名称类访问;* 类名称.成员变量* 类名称.成员方法();
* 2. 方式二: 使用对象名访问;(不推荐的)* 对象名.成员变量* 对象名.成员方法();
* 注意点:
* 被static修饰的内容属于类的一部分,应该使用类名称访问 * 静态的内容和非静态的内容如何进行相互之间访问的问题: * 1. 被static修饰的内容,可以理解成先人(随着类的加载而存在) * 2. 非static修饰的内容, 可以理解成后人(随着对象的创建而存在) * * 特点: * 1. static修饰的方法不能访问普通内容(非static修饰); 先人(李世明)不知道后人(习*平) * 2. 非static方法,可以访问静态内容; 后人知道先人 如:public class Person {String name;static int num;public void methodNormal(){System.out.println(name);System.out.println(num);methodStatic();}public static void methodStatic(){// static修饰的方法不能访问普通内容(非static修饰); 先人(李世明)不知道后人(习*平)//System.out.println(name);//methodNormal();}}
(注意:) 1.被static修饰的方法可以看做是工具类
2.而被static修饰的变量可以被其他类共享 3.被final static修饰的变量可以看做为全局常量(因为值是共享的,且值是不变的) (注意(难理解):)被static修饰的方法与不被static修饰的方法的区别:类名.方法() 这是静态方法独有的方法调用格式,(静态的方法的调用:直接类名.方法名 ) 如果在getFight方法中不加static,只能重新创建new对象,再调用方法.package cn.itcast.test02;/** 使用战士工厂根据传入的参数生产不同的战斗人类(警察和战士),并让能战斗的人类进行战斗,战士战斗前需要武装后再进行战斗提示: 把战斗功能抽取到接口中 ,把战斗人类通用的姓名放在抽象类中; */public class Test01 {public static void main(String[] args) {Man jc = FightFactory.getFight(1);//类名.方法() 这是静态方法独有的方法调用格式Man sd = FightFactory.getFight(2);//向下转型,不能写成new FightFactory.getFight(1);((JingCha)(FightFactory.getFight(1))).zhanDou();//如果在getFight方法中不加static,只能重新创建new对象,再调用方法./*FightFactory f = new FightFactory();f.getFight(1);*/JingCha jc1 = (JingCha) jc;Soldier sd1 = (Soldier) sd;jc1.zhanDou();sd1.zhanDou();}}package cn.itcast.test02;public class FightFactory {public static Man getFight(int i){//如果不加static,main方法会报错.if (i==1) {return new JingCha("张三");}if (i==2) {return new Soldier("王五");}return null;}}
* 在多态的体现形式下,访问静态内容和非静态内容的特点:* 非静态内容: * 成员变量: 编译看左边, 运行看左边 * 成员方法: 编译看左边, 运行看右边 * * 静态内容: * 成员变量: 编译看左边, 运行看左边 * 成员方法: 编译看左边, 运行看左边
public class Demo01StaticVariable {public static void main(String[] args) {// 非静态内容的访问Animal ani = new Cat();System.out.println(ani.name);//张三 编译看左边, 运行看左边 ani.method();// 编译看左边, 运行看右边System.out.println("===========");// 静态内容访问System.out.println(ani.country);// 中国 编译看左边, 运行看左边ani.methodstatic();// 编译看左边, 运行看左边}}package package04static;//动物类public class Animal {String name = "张三";static String country = "中国";public void method(){System.out.println("Animal === method");}public static void methodstatic(){System.out.println("Animal === methodstatic");}}package package04static;//猫类public class Cat extends Animal {String name = "李四";static String country = "美国";public void method(){System.out.println("Cat === method");}public static void methodstatic(){System.out.println("Cat === methodstatic");}}
结果:张三Cat === method===========中国Animal === methodstatic
* 什么是静态代码块呢?
* 被static修饰的代码块称为静态代码块. * 格式: * static{ * * } * * 特点: * 1. 只要静态代码块所在的类被使用(不管以什么样的形式)马上就会执行, 并只会执行一次 * 2. 静态代码块一般可以用来加载驱动驱动信息,比如: 数据库驱动 * * 构造代码块: 只要创建对象就会执行,一般情况下可以给final成员变量去赋值.还可编写构造方法中共有的代码 * 构造方法: 只要创建对象就会执行, 创建对象的时候调用package package05staticBlock;/** 面试题: * 说出以下的代码执行的流程;* A-D-E-F-B-C* A-D-B-E-C-F* A-D-B-C-E-F 正确* * 执行流程:* 1. 父类静态代码块* 2. 子类静态代码块* 3. 父类构造代码块 * 4. 父类构造方法* 5. 子类构造代码块* 6. 子类构造方法* * 构造代码块: */public class Demo02StaticPractice {public static void main(String[] args) {new Cat();int a = 10;System.out.println(a);}}package package05staticBlock;//动物类public class Animal {static{System.out.println("A: Animal === 静态代码块");}{System.out.println("B: Animal == 构造代码块");}public Animal(){System.out.println("C: Animal == 构造方法");}public Animal(int a, int b){}public Animal(int a, float b, int c){}}package package05staticBlock;//猫类public class Cat extends Animal {static{System.out.println("D: Cat === 静态代码块");}{System.out.println("E: Cat == 构造代码块");}public Cat(){System.out.println("F: Cat == 构造方法");}}