1. 什么是Static 关键字?

Static 能够与变量,方法和类一起使用,称为静态变量,静态方法。如果在一个类中使用static修饰变量或者方法的话,它们可以直接通过类访问,不需要创建一个类的对象来访问成员。

实例:

package com.java.JavaStatic;
/**
* Understand Java Static
* @author Jeff
* @date 2016/03/17
* http://www.weixueyuan.net/view/6003.html
*/ public class demo01 {
//定义静态变量a
public static int a=1; //定义变量b
int b=2; //创建静态方法 sum()
public static int sum (int x,int y) {
return x+y;
} public static void main (String[] args) {
//通过类访问变量a
System.out.println("a= "+demo01.a); //实例化对象myDemo访问变量b
demo01 myDemo =new demo01();
System.out.println("b= "+myDemo.b); //通过类访问方法sum
System.out.println("x+y: "+sum(3,5));
}
}

结果:
a= 1
b= 2
x+y: 8

2. Static 内存分配

静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。

实例:

package com.java.JavaStatic;

/**
* Static内存分配
* @author Jeff
* 2016/4/3
* http://www.weixueyuan.net/view/6003.html
*/ public class demo02 {
static int i;
int j; public static void main(String[] args) {
demo02 obj1 = new demo02();
obj1.i = 10;
obj1.j = 20;
demo02 obj2 = new demo02();
System.out.println("obj1.i=" + obj1.i + ", obj1.j=" + obj1.j);
System.out.println("obj2.i=" + obj2.i + ", obj2.j=" + obj2.j);
}
}

结果:
obj1.i=10, obj1.j=20
obj2.i=10, obj2.j=0

3. 什么情况使用静态方法和静态变量

  • 需要通过类访问静态方法和静态变量
  • 需要在静态方法中访问静态变量
  • 静态方法的类型不是对象型

3. 关于静态变量和静态方法的总结:

  • 结论1.构造方法不允许声明为 static 的;
  • 结论2.1.静态方法只能访问静态变量
  • 结论2.2.静态方法不能访问实例变量
  • 结论3.1.静态方法只能够调用静态方法;
  • 结论3.2.静态方法不能够调用非静态方法;
  • 结论4.静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super
  • 结论5.局部变量不能使用static修饰
  • 结论6.1.静态方法能被静态方法重载
  • 结论6.2.静态方法能被非静态方法重载
  • 结论7.1 静态方法,可以声明object类型,一般不推荐使用静态方法,因为不能通过类访问
  • 结论7.2 非静态方法,可以声明object类型,一般推荐使用,因为可以使用实例访问
  • 结论8. 静态方法只能在静态类中使用
  • 结论9.1.静态方法不能被非静态方法覆盖
  • 结论9.2 静态方法能被静态方法覆盖
  • 结论10 静态方法直接通过类访问
  • 结论11 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐
  • 结论12 静态方法且类型对象,不能通过类访问

实例:

package com.java.JavaStatic;

/**
* 静态方法和静态方法总结
* @author Jeff
* 2016/04/03
*/ public class demo03 { public static int a=1;
int b=2; //结论1.构造方法不允许声明为 static 的;
// public static demo03 ()
// {
// System.out.println("我是构造方法");
// } public int sum (int x,int y) {
return x+y;
} //静态方法sum2, int类型 public static int sum2 (int x,int y) {
//结论2.1.静态方法只能访问静态变量
a=3;
x=x+a; //结论2.2.静态方法不能访问实例变量;
//b=3; //结论3.1.静态方法只能够调用静态方法;
demo03.sum3(1, 2); //结论3.2.静态方法不能够调用非静态方法;
//demo03.sum(1,2); //结论4.静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super
//this.sum3(1, 2); return x+y;
} //静态方法sum3,int类型
public static int sum3 (int x,int y) {
//结论5.局部变量不能使用static修饰
//static int c;
return x+y;
} //结论6.1.静态方法能被静态方法重载
public static int sum3 (int x) {
return x;
} //结论6.2.静态方法能被非静态方法重载
public int sum3 (int x, int y, int z) {
return x+y+z;
}
//结论7.1 静态方法,可以声明object类型,一般不推荐使用静态方法,因为不能通过类访问
public static demo03 object () {
demo03 d=new demo03();
d.b=3;
return d;
} //结论7.2 非静态方法,可以声明object类型,一般推荐使用,因为可以使用实例访问
public demo03 object2 () {
demo03 d=new demo03();
d.b=3;
return d;
} //结论8. 静态方法只能在静态类中使用
public static class superClass {
public static int getAge (int age) {
return age;
} public static String getName (String name) {
return name;
}
} public static class childClass extends superClass { //结论9.1.静态方法不能被非静态方法覆盖
// public String getName (String name) {
// return name;
// } //结论9.2 静态方法能被静态方法覆盖
public static String getName (String name) {
return name;
}
}
public static void main (String[] args) {
//结论10 静态方法直接通过类访问
System.out.println("x+y: "+demo03.sum2(3,5)); //结论11 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐
demo03 de=new demo03();
de.sum2(1,2);
de.a=4; //结论12 静态方法且类型对象,不能通过类访问
//demo03.object;
}
}

4.静态导入

对于使用频繁的静态变量和静态方法,可以将其静态导入.
实例:

package com.java.JavaStatic;

//1.通过 import static java.lang.System.*; 将其导入,下次直接调用 out.println() 就可以了
import static java.lang.System.*; //2.导入类中的Math.random
import static java.lang.Math.random; /**
* 静态导入. 对于使用频繁的静态变量和静态方法,可以将其静态导入
* @author Jeff
* @date:2016/4/4
* http://www.weixueyuan.net/view/6003.html
*/ public class demo04 {
public static void main(String[] args) {
//输出语句 System.out.println(); 中的 out 就是 System 类的静态变量,
out.println("产生的一个随机数:" + random());
}
}

Java继承和多态-Static关键字的更多相关文章

  1. Java 继承和多态

                                                        Java  继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...

  2. “全栈2019”Java第四十一章:static关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. C++ 类的继承五(类继承中的static关键字)

    //类继承中的static关键字 #include<iostream> using namespace std; /* 派生类中的静态成员 基类定义的静态成员,将被所有派生类共享 根据静态 ...

  4. 四. Java继承和多态7. Java static关键字

    static 修饰符能够与变量.方法一起使用,表示是“静态”的. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法.静态 ...

  5. 四. Java继承和多态8.Java final关键字:阻止继承和多态

    在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...

  6. Java继承和多态实例

    我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...

  7. Java继承与多态

    感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...

  8. Java 继承、多态与类的复用

    摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...

  9. Java:final、static关键字 详解+两者结合使用

    一  final关键字 1) 关于final的重要知识点 final关键字可以用于成员变量.本地变量.方法以及类. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. ...

随机推荐

  1. windows上利用dhcpsrv搭建DHCP服务器

    起因是一个很奇葩的需求:乙方要远程升级仪器,用TeamViewer远程控制并ssh到仪器,但仪器内部IP地址没有写死,靠DHCP服务器获取.那么就要在PC建立DHCP服务器,用网线连接仪器,然后才能看 ...

  2. Windows下spark1.6.0本地环境搭建

    由于spark是用scala编写的,且需要jdk的环境支撑,所以本地spark环境的搭建需要四个步骤:JDK的安装,scala的安装,hadoop的配置,spark的配置. 一.jdk的安装与环境变量 ...

  3. HNUSTOJ-1565 Vampire Numbers(暴力打表)

    1565: Vampire Numbers 时间限制: 3 Sec  内存限制: 128 MB提交: 20  解决: 9[提交][状态][讨论版] 题目描述 The number 1827 is an ...

  4. ECCV2014 Accepted paper

    今天早上看到小伙伴们说ECCV2014结果出来了, 自己于是赶紧看了下, 感觉ECCV2014显著性的文章和以往的不太一样. 1.Salient Montages from Unconstrained ...

  5. django字段类型(Field types)介绍

    字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动 ...

  6. mysql proxysql的简单部署读写分离

    环境需求(centos) proxysql-server(1)-- 地址:proxysql-service mysql-master-server(1)--- 地址:mysql1-service my ...

  7. mysql中的substring()截取字符函数

    substring(参数1,参数2,参数3),其中三个参数分别表示:参数1表示需要截取的字符串,参数2表示从字符串的那个位置开始截取(字符串下标从1开始),参数3表示要截取多少位,如果不写,表示截取从 ...

  8. Vue环境搭建和项目创建

    目录 vue项目 环境搭建 项目创建 vue项目 环境搭建 node node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城 ...

  9. 一份贴近真实面试的Java面试题(基础部分)

    这是一份关于Java基础的面试题.在网上的关于Java的面试题数不胜数,但本人认真看过后觉得大多数都没有实用性,有很多是面试官根本就不会问到的,企业根本不会用到的,一些已经脱离了实际开发的技术问题.而 ...

  10. mkswap - 建立一个linux交换区

    总览 mkswap [-c] [-vN] [-f] device [size] 描述 mkswap 在一个设备上或者在一个文件里创建一个linux交换区. (该交换区创建后,必须使用 swapon 命 ...