static关键字的使用(有个深刻领悟)

没有实例化对象的时候进行可以调用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

时间: 2024-08-06 07:50:44

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

数据持久化、单例、重载【添加对不可访问的成员的操作】、魔术方法、类常量、static关键字对self的补充【静态延迟绑定实现$this的效果】、参数类型约束【参数前加类名】、遍历【iterator接口】、快速排序

1.数据持久化过程[传输(例如表单提交或php交互mysql)和保存过程] 使用的是字符串形式的流数据. 数据流就是为了传输[按照序列的形式进行传输] [http://baike.baidu.com/link?url=0MtUQMhFzc_EwJc09rXZV8KlfOL4jis6XNbRfmGA3rQhDcGwOp8togLVQjXBV34M] 所以将其他类型数据转化为字符串的过程也是序列化的过程 [这个概念和图片.视频的流媒体的区别?] [注意点] 另外mysql中sql语句中的某些关键词为

Static关键字

1.static修饰的资源属于类级别的资源,静态的资源,对于类的所有实例对象的共享的资源 2.static关键字可以用来修饰属性,方法,代码块 3.static修饰的资源,在类加载期间执行 Static修饰的属性 static关键字修饰属性,属于对类所有实例对象共享的变量 访问静态的属性:类名.属性名 Static修饰的方法 static关键字修饰的方法属于静态方法可以直接类名.方法名()进行调用,一般的是把静态方法作为工具方法 静态方法中不能调用对象的资源(对象属性,对象方法); Static

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

java中static关键字的理解

static关键字 解决两种问题 1.   只想为某特定域分配单一的存储空间,而不去考虑究竟要创建多少对象,甚至根本不创建任何对象 2.   希望某种方法不与包含它的任何对象关联在一起,也就是说,即使没有创建对象也能调用这个方法 当static作用于某个字段时,肯定会改变数据创建的方式,因为一个static字段对每个类时只有一份存储空间,而非static字段则是对每一个对象都有一个存储空间 和其他方法一样,static方法可以创建或使用其类型相同的被命名的对象,因此static方法常常被拿来做牧

java编程思想-——static关键字

对于java来说,创建类时候,就是在描述那个类的对象的外观和行为.除非用new创建那个类的对象,否则,实际上并未获得任何对象.执行new操作的时候,数据存储空间才被分配,其方法才被外界所调用. 1.什么是static关键字 static关键字标示的变量和方法,只分配单一的存储空间.不去考虑究竟要创建多少个对象,甚至根本就不用创建对象.没有创建对象也可以访问static标记的对象或者方法. 对于static标记的对象,即可以用对象来操作,也可以用类来操作. 2.static的一些用法. 对于sta

static关键字的使用

static关键字的使用: * 1.static:静态的 * * 2.static可以用来修饰:属性.方法.代码块.内部类. * * 3. 使用static修饰属性:类变量(或静态变量 * >使用static修饰的变量,被类的所对象所共享:类的所对象共同同一个静态变量. * 对比:不用static修饰的属性,称为:实例变量.每个对象拥一份实例变量.通过对象a修改某个实例变量, * 不会影响其他对象同名的实例变量的值. * >我们可以通过对象a去调用或修改静态变量的值,那么会影响其他对象对此静态

Java static 关键字

本文介绍 Java static 关键字的用法和注意点: 1. 使用 static 声明属性--即 static 声明全局属性 2. 使用 static 声明方法--即通过类名直接调用 static 方法 注意点: 使用 static 方法的时候,只能访问 static 声明的属性和方法,而非 static 声明的方法和属性是不能访问的. 我们使用如下代码声明三个对象,并且相应的进行赋值: package hello; class People2{ String name; int age; p

PHP static 关键字和 self 关键字实例化的区别

在实例化时,static 关键字类似于 self 关键字,但 static 关键字指的是被调用的类,而 self 关键字指的是包含类. 这样说可能不太好理解,接下来举一个例子. 首先创建一个超类 DomainObject ,该类包含功能可被其扩展类共用,其次创建一个子类 Document . 代码如下: abstract class DomainObject { public static function create() { return new self(); } } class Docu

5.JAVA基础复习——JAVA中的static关键字作用与用法

static关键字: 特点: 1.static是一个修饰符,用于修饰成员.(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量. 2.static修饰的成员被所有的对象共享. 3.static优先于对象存在,因为static的成员随着类的加载就已经存在. 4.static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员). 5.static修饰的数据是共享数据,对象中的存储的是特有的数据. 1 private static int age;//用static