• 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

  • 相关阅读:
    nginx 403 forbidden 二种原因
    【Spring-AOP-学习笔记-3】@Before前向增强处理简单示例
    【Oracle学习笔记-5--】集合操作之union,intersect和minus操作
    【Oracle学习笔记-2】Oracle基础术语解析
    【数据库设计-1.2】主键的设计
    【数据库设计-1.1】关系的实现
    【Servlet和JSP-学习-1】基础知识
    【Spring学习笔记-MVC-17】Spring MVC之拦截器
    【Spring学习笔记-MVC-1.0】Spring MVC架构介绍
    【Spring学习笔记-MVC-16】Spring MVC之重定向-解决中文乱码
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/7413884.html
Copyright © 2020-2023  润新知