没有实例化对象的时候进行可以调用static 属性  static方法 (用类名去调用)

非static定义的方法可以调用static的属性或方法。
static定义的方法不能调用非static的方法或属性;
非static方法几乎都有一个特点:方法要由实例化对象调用
或者在web开发中,由url调用
/* 最深刻透彻醍醐灌顶的领悟*/
以前想为啥啊,那个url就可以执行了非static方法了
Servlet的工作原理就是反射,所有,MVC框架的controller都是这个机制
Servlet的执行是:Tomcat容器通过web.xml的配置反射出类的对象,然后指向类中方法
————————————————————————————————————
中安科技框架底层都是反射机制
hibernate要用面向对象的方法操作数据库,反射生成对象去操作方法
生成的这个对象要用java的反射机制。
传递进去一个字符(包名+类名)串反射出一个对象

static定义属性(类比this.属性)
范例:现在定义一个表示北京人的操作类,所有人所在的城市都是北京
class Person {
private String name ;
private int age ;
String country = "北京" ; // 此处暂时不封装
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
public String getInfo() {
return "姓名:" + this.name + ",年龄:" + this.age + ",城市:" + this.country ;
}
}
public class TestDemo {
public static void main(String args[]) {
Person per1 = new Person("张三",20) ;
Person per2 = new Person("李四",21) ;
Person per3 = new Person("王五",22) ;
System.out.println(per1.getInfo()) ;
System.out.println(per2.getInfo()) ;
System.out.println(per3.getInfo()) ;
}
}

很明显,现在不管有多少个Person对象,那么所有的country属性都应该是相同的内容,那么现在请思考一下,如果有一天时光穿越了,北京变为燕京了,这个时候如果Person类已经有了5000W个对象产生了,你认为此时的代价是什么?
5000W个Person对象都需要修改country的内容,那么如果按照修改一个对象的country属性内容要花费1ms来计算,那么5000W个对象的修改时间是:50000S = 很多分钟,那么现在就可以发现问题:
? country属性应该是一个公共的内容,但是以上代码是将其分配给了每一个对象;
? 对country属性维护的时候要考虑的对象太多了,也不方便。
所以,如果要想将country与普通属性相区分,并且表示公共的概念,则应该使用static关键字完成。

———————————————————————————————

class Person {
private String name;
private int age;
static String country = "北京"; // 此处暂时不封装

public Person(String name, int age) {
this.name = name;
this.age = age;
}

// 用当前对象this可以调用静态字段
public String getInfo() {
return "姓名:" + this.name + ",年龄:" + this.age + ",城市:" + this.country;
}
}
/*飞秋占用剪切板了所以不可以复制粘贴了*/
public class Test {
public static void main(String args[]) {
Person p =new Person("Tom",88);
System.out.println(p.getInfo());
//姓名:Tom,年龄:88,城市:北京
p.country="燕京";
System.out.println(new Person("Lisa",8).getInfo());
//姓名:Lisa,年龄:8,城市:燕京

Person.country = "燕京2" ;
System.out.println(new Person("Linda",18).getInfo());
}// 姓名:Linda,年龄:18,城市:燕京2
}

/*既然使用了static定义的属性表示的是公共属性,那么如果现在由某一个对象修改是不合适的,
* 应该由所有对象的集合的最大代表,就是类了
* ,即:static属性最好的调用,是通过“类名称.static属性”的方式来完成。
* */

? 使用static定义的属性不在堆内存之中保存,保存在全局数据区;
? 使用static定义的属性表示类属性,类属性可以由类名称直接进行调用;
? static属性虽然定义在了类之中,但是其可以在没有实例化对象的时候进行调用(普通属性保存在堆内存里,而static属性保存在全局数据区之中);
提示:在以后的开发之中,首先想到的不是static属性,就是普通属性。

___________________________________________
static定义的方法不能调用非static的方法或属性;
? 非static定义的方法可以调用static的属性或方法。
讨论:为什么要有这样的限制呢?
? 使用static定义的属性和方法,可以在没有实例化对象的时候使用;
? 非static定义的属性和方法,必须实例化对象之后才可以进行调用。

——————————————————————————————

class Person1{
static void say(){System.out.println(1);}
static void say1(){
say();
Person1.say();
}
}
/*飞秋占用剪切板了所以不可以复制粘贴了*/
public class Test {
public static void main(String args[]) {
Person1.say1(); //依次输出 1 1
System.out.println(java.lang.Math.E);//2.71828
System.out.println(Math.abs(-2));//2
}//直接写上abs()方法是不行的
}//没有对象,方法照样调用起来

———————————————————————————————————————————————
在实际的工作之中,使用static的原因有二:
? 希望可以在没有实例化对象的时候可以轻松的执行类的某些操作;
? 现在希望表示出数据共享的概念。
——————————————————————————————————————————————
范例:统计一个类产生的实例化对象个数
一个类肯定可以有多个实例化对象产生,那么现在希望增加一个统计操作,可以统计出一个类之中的所产生的实例化对象的个数。如果现在要产生新的实例化对象,则一定会调用类中的构造方法,所以可以在构造方法中增加统计,而且这个统计的变量,应该是所有对象共享的,那么应该将其定义为static属性

class Person {
static int count = 0;

public Person() { // 构造方法一定会调用
System.out.println("对象个数:" + ++count);
}
}

public class Test {
public static void main(String args[]) {
new Person();
new Person();
new Person();
System.out.println(Person.count);
}
}
/**
* 对象个数:1
对象个数:2
对象个数:3
3
*
* */
________________________________________
类的属性自动命名
class Book {
private static int count = 0;
private String title;

public Book() { // 自动命名
this("NOTITLE - " + count++);
}
public Book(String title) {
this.title = title;
}

public String getTitle() {
return this.title;
}
}

public class Test {
public static void main(String args[]) {
System.out.println(new Book().getTitle());
System.out.println(new Book("Java SE").getTitle());
System.out.println(new Book().getTitle());
}
}
NOTITLE - 0
Java SE
NOTITLE - 1

static关键字的使用(有个深刻领悟)的更多相关文章

  1. Java学习笔记之面向对象、static关键字

    一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...

  2. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  3. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  4. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  5. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  6. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  7. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  8. c++中static关键字的用法总结

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  9. static关键字

    static关键字 static是静态修饰符,一般修饰成员.被static修饰的成员属于类,不属于单个这个类的某个对象. 1.static关键字的特点 a:随着类的加载而加载 b:优先于对象存在 (还 ...

随机推荐

  1. 1.DNS基础及域名系统架构

    一.域名: IP地址往往难以记忆,所以我们一般使用域名进行管理 www.LinuxCast.net 1.严格的域名最后还有一个".",但一般省略不写 2.域名分为三个部分,用&qu ...

  2. Linux 目录配置标准:FHS

    目录 应放置内容 /bin 和/user/目录下的/bin/都是用来保存的系统命令 /sbin 和/user/目录下的/sbin是用来保存root的系统命令 /boot 这个目录主要放置开机所用的文件 ...

  3. MarkDown编辑器中缩进

    首先,Markdown是不支持缩进的. 在Markdown里按下四个空格,就自动转入Code模式. 在Markdown里一个回车,不是分段而是换行,要两个回车,才是分段. 分段和换行的区别是:换行后, ...

  4. Problem A 还会用继承吗?

    定义一个Base类,包括1个int类型的属性,以及满足输出格式要求的构造函数.拷贝构造函数和析构函数. 定义Base类的子类Derived,包括1个int类型的属性, 以及满足输出格式要求的构造函数. ...

  5. php优秀框架codeigniter学习系列——common.php

    文件位于system/core/common.php,是框架核心文件. 该文件中定义了一系列的函数,都是框架运行中经常需要用到的.下面逐一介绍. is_php /** * Determines if ...

  6. CSS学习笔记之样式规划

    大家都知道规范灵活的代码布局对提升程序员开发和后期维护效率至关重要,因为css同一元素可能被不同偏重度的选择器命中,相同元素不同的选择器表达式的样式冲突导致的显示异常,再加上不规范的代码,经常让前端代 ...

  7. DRBD常用管理篇

          在DRBD进入使用阶段之后,要经常查看它的工作状态,通过这些状态来判断DRBD运行情况. 1) 使用drbd-overview命令观察状态      最为简便的方式就是运行drbd-ove ...

  8. Arrays.copyOfRange()

    Comparable[] aux = Arrays.copyOfRange(arr,from, to); 复制数组arr, from下标开始, to下标结束. 但是不包括to. 所以复制代码为 Com ...

  9. socket 聊天室实现

    server #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket ...

  10. quartz储存方式之JDBC JobStoreTX

    这篇单单记录一下个人配置使用quartz的JDBC JobStoreTX的过程以及其中遇到的问题,这里的quartz是version2.2.1,数据库使用的MySQL. JDBCJobStore储存是 ...