2016.7.29终于弄清楚的static关键字
2016-07-29 15:16
453 查看
关于static,以前敲代码经常看到,但反正觉得看得懂就行,经常得过且过,现在准备好好梳理一下知识,就来看下这个static关键字的作用。
1.在Java里,可以定义一个不需要创建对象就能够调用的方法,这种方法就是静态方法。
静态方法可以直接通过 (类名.方法名)进行调用;
而非静态方法需要先new出该方法所在类的实例(对象),在通过该实例调用非静态方法
例子如下:
public class B {
//静态方法
public static void sayhello(){
System.out.println("helloWorld");
}
//非静态方法
public void sayHi(){
System.out.println("hiWorld");
}
public static void main(String[]args){
B.sayhello();//静态方法可以直接通过类名.方法名调用
B b=new B();//飞静态方法需要先new一个实例,再通过实例调用
b.sayHi();
}
}
2.在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员,非静态方法的调用先要new出实例,而非静态变量的调用我还不知道。案例如下:
public class B {
//静态变量number和静态方法hello
public static int number=1;
public static void hello(){}
//非静态变量number2和非静态方法hi
public int number2=2;
public void hi(){}
public static void sayhello(){
//静态方法只能直接调用同类其他静态成员(方法,变量)
B.hello();
System.out.println(number);
//而不能直接访问类中的非静态成员
B b=new B();
b.hi();
}
}
3.静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所指的本类对象没有产生;同理,super指的是父类对象,静态方法的调用先于对父类对象的引用,所以用super也会报错。案例如下:
public class C {
private String name;
public void setName(String name){
this.name=name;//无错
}
public static void setName2(String name){
this.name=name;//this报错
}
}
4.静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,案例如下:
fun()
{
static int i=0;//非法。
}
5.一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}
小例题:
class
Parent {
static String name = "hello";
{
System.out.println("parent block");
}
static {
System.out.println("parent static block");
}
public Parent(){
System.out.println("parent constructor");
}
}
class Child extends Parent{
static String childName = "hello";
{
System.out.println("child block");
}
static {
System.out.println("child static block");
}
public Child(){
System.out.println("child constructor");
}
}
public class C {
public static void main(String[] args) {
new Child();//语句(*)
}
}
<
4000
/span>
问输出结果是什么?
父类静态代码块>子类静态代码块>父类非静态代码块>父类构造方法>子类非静态代码块>子类构造方法
所以输出结果为:
parent static block
child static block
parent block
parent constructor
child block
child constructor
感谢ID小顾问http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html;
1.在Java里,可以定义一个不需要创建对象就能够调用的方法,这种方法就是静态方法。
静态方法可以直接通过 (类名.方法名)进行调用;
而非静态方法需要先new出该方法所在类的实例(对象),在通过该实例调用非静态方法
例子如下:
public class B {
//静态方法
public static void sayhello(){
System.out.println("helloWorld");
}
//非静态方法
public void sayHi(){
System.out.println("hiWorld");
}
public static void main(String[]args){
B.sayhello();//静态方法可以直接通过类名.方法名调用
B b=new B();//飞静态方法需要先new一个实例,再通过实例调用
b.sayHi();
}
}
2.在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员,非静态方法的调用先要new出实例,而非静态变量的调用我还不知道。案例如下:
public class B {
//静态变量number和静态方法hello
public static int number=1;
public static void hello(){}
//非静态变量number2和非静态方法hi
public int number2=2;
public void hi(){}
public static void sayhello(){
//静态方法只能直接调用同类其他静态成员(方法,变量)
B.hello();
System.out.println(number);
//而不能直接访问类中的非静态成员
B b=new B();
b.hi();
}
}
3.静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所指的本类对象没有产生;同理,super指的是父类对象,静态方法的调用先于对父类对象的引用,所以用super也会报错。案例如下:
public class C {
private String name;
public void setName(String name){
this.name=name;//无错
}
public static void setName2(String name){
this.name=name;//this报错
}
}
4.静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,案例如下:
fun()
{
static int i=0;//非法。
}
5.一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}
小例题:
class
Parent {
static String name = "hello";
{
System.out.println("parent block");
}
static {
System.out.println("parent static block");
}
public Parent(){
System.out.println("parent constructor");
}
}
class Child extends Parent{
static String childName = "hello";
{
System.out.println("child block");
}
static {
System.out.println("child static block");
}
public Child(){
System.out.println("child constructor");
}
}
public class C {
public static void main(String[] args) {
new Child();//语句(*)
}
}
<
4000
/span>
问输出结果是什么?
父类静态代码块>子类静态代码块>父类非静态代码块>父类构造方法>子类非静态代码块>子类构造方法
所以输出结果为:
parent static block
child static block
parent block
parent constructor
child block
child constructor
感谢ID小顾问http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html;
相关文章推荐
- iOS杂记——static关键字作用
- 第2章 Java编程基础——FAQ2.06 static关键字有什么含义?具体如何应用?能修饰构造方法吗?
- stm32f103学习笔记——关键字extern、static、const
- Java学习之关键字final、static
- 关键字static/const的作用
- Java技术——Java中的static关键字解析
- static 关键字
- C++中的static关键字
- C++ 之 static 关键字
- C语言 static和extern关键字 对变量的作用
- Java关键字final、static使用总结
- 黑马程序员——Java基础---static关键字
- static和extern关键字2-对变量的作用
- Java关键字final、static使用总结
- static 关键字
- Java中的static关键字解析
- static关键字
- Java进阶---关键字static
- Java 关键字—— static 与 final
- static关键字