static总结

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 == 构造方法");
}

}

  

 

posted @ 2017-12-27 22:13  Zennon  阅读(143)  评论(0编辑  收藏  举报