`
java_fei
  • 浏览: 21624 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

谈谈static

 
阅读更多

对于static你到底理解了多少

               曾今我对static非常难以理解,因为我有一个同事把所有的的类方法都加了static,上层调用只需直接类名加方法名就OK了,如果有幸看到这文章,你可以去看下你的程序应该也可以用这种方式去做(一般使用spring ioc)的话基本都可以。为什么,当初我就想,为什么大家宁愿去new一个对象去调用下层代码,而不愿意去加static更方便调用。现在工作两年过去了,我终于知道了结果。归根结底,java是面向对象编程而不是面向过程。对于static的理解你到下面那一层了呢?

 

            理解一

                      对于方法:加了static那么方法就变成了类的静态方法,可以用 (类名.方法)  来实现调用。

                      对于变量:加了static那么变量就变成了类的成员变量。可以用  类名.变量)来实现调用。

 

            理解二

                      对于方法:加了static和不加static都是存放在内存的方法区,无论你是否使用了static对于内存

                                        而言没有任何变化,除非当类被释放,也就是jvm full gc回收。

                      对于变量:没加static每次new一个对象都会开辟内存来存放数据,加了static无论你new多少个

                                        对象永远只会有一块区域来共享它

 

            理解三

                      既然方法加了static对于内存没有什么区别,而加static之后调用如此方便,还不需要new对

                      象。那么为什么我们经常使用的是:A a=new A(); a.doSome();这种形式而是不是做成

                       A.doSome()呢。(前提没有成员变量)。

                      原因:一:面向对象思想,当你把方法变成static之后,你A类的子类将无法覆盖其父类的

                                       doSome方法。

                                 二:你无法再将doSome方法中的一些变量,变成只属于该对象的变量。比如一个类里

                                         面都有个a变量,如果你三个方法都是static的话,你三个方法都需要传递a参数。

                                          让你的代码越加复杂

             

             理解四

                      那么我们每次都要去调用这个方法都要new一个对象,这样会对jvm回收会加剧,写起来很麻

                      烦,创建和销毁对象是很消耗cpu的,那么就有了设计模式-单例模式。

 

             理解五

                      为什么很多公司都使用spring ioc的模式,因为他解决以下几个问题,你不用每次都去为类

                      创建一个个单例对象(static带来的方便),第二它又非常容易扩展(面向对象的优点)。所以我上

                      文提到使用 spring ioc基本都可以把方法变成static来供上层调用。所以我对ioc的理解为:它为

                      我们节省了自己去创建单例的时间,并且让我们以面向对象的思想来调用和扩展代码。

 

当然对于一些不需要扩展或者变更不大的比如util类 它就非常适合使用static。面向对象让整个程序看起来更加合理,更加方便,更加容易理解。

 
分享到:
评论

相关推荐

    static-html.zip|static-html.zip

    接下来,我们来谈谈Bootstrap。Bootstrap是由Twitter开发的开源前端框架,旨在简化响应式网站的设计和开发。Bootstrap 4是其最新的重大更新,带来了许多改进,如全新的Flexbox布局模型、更丰富的图标集、改进的组件...

    C++ static关键字详细应用指南

    接着,我们来谈谈静态局部变量。静态局部变量与静态全局变量类似,也是存储在全局数据区域的,这意味着它们不会随着函数的返回而被销毁。静态局部变量在声明时分配内存,并且仅在程序执行到声明处时被初始化一次。...

    谈谈网吧路由器怎样设置的

    下面我们就来谈谈网吧路由器怎样设置。  网吧路是有网络供应商供应一条宽带光缆,这条光缆的带宽比家用的宽,速度要快。光缆经过光收发器接入路由器,路由器下面可以再接数个交换机,普通一台交换机有24个口,个中...

    JAVA程序员32问

    第一,谈谈final, finally, finalize的区别。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的...

    谈谈Android里的Context的使用

    public static void showToast(Context context,String msg){ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } /** * 调用全局的Context. * @param msg */ public static void ...

    static-initializer-blocking-demo

    现在,我们来谈谈“synced块”或同步块。在Java中,同步块用于控制对共享资源的并发访问,以防止数据不一致。当多个线程同时访问一个共享对象时,可能会引发竞态条件。同步块通过指定一个监视器对象来限制对代码的...

    静态(static)方法的继承和重写

    首先,我们来谈谈静态方法的继承。当一个子类继承了父类,它会自动继承父类中所有的公共和保护静态成员,包括静态方法。这是因为静态成员属于类本身,而不是类的对象。例如,如果父类有一个名为`calculateArea`的...

    谈谈分页插件的配置与使用

    public static <T extends BaseModel> IPage<T> buildPage(BaseQuery baseQuery) { Page<T> page = new Page(); page.setCurrent(baseQuery.getPageIndex() == 0 ? 1 : baseQuery.getPageIndex()); page.setSize...

    第13讲 谈谈接口和抽象类有什么区别?1

    接口不能被实例化,它也没有非静态的成员变量,所有的字段默认都是`public static final`的,这意味着它们是常量。接口的主要作用是定义规范,允许类实现多个接口以达到多继承的效果,这在Java中是唯一的多继承方式...

    谈谈连接器是如何工作的

    然而,有时即使没有在代码中直接看到重复定义,也可能因为使用了静态库(static library)而导致问题。静态库是多个目标文件的集合,链接时,链接器会自动从库中提取所需的目标模块,以解决程序中引用的函数和变量。...

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还需要了解&和&&的区别。&是位运算符,&&是布尔逻辑运算符。 ...

    谈谈在.NET下的多线程编程

    private static void ThreadFunc() { DateTime start = DateTime.Now; while ((DateTime.Now - start).Seconds ) { // 这里可以添加线程要执行的任务 } } ``` 在这个例子中,每个线程的`IsBackground`属性都被...

    第3讲 谈谈final、finally、 finalize有什么不同1

    在Java核心类库中,许多关键方法(如Collections的static方法)都被声明为final,以防止意外的重写。 3. **修饰变量**:final变量一旦被初始化后,其值就不能改变。对于局部变量,这意味着只能赋值一次;对于实例...

    Static-Events-Sites:Netlify上使用的所有静态页面

    接下来,我们谈谈CSS。层叠样式表(CSS)是用于描述HTML或XML(包括如SVG、MathML等各种XML方言)文档样式的语言。在"Static-Events-Sites"项目中,CSS被用于定义各个事件页面的视觉样式,包括颜色、布局、字体、...

    通过实例程序验证与优化谈谈网上很多对于Java DCL的一些误解以及为何要理解Java内存模型.doc

    private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { // 第一次检查 synchronized (Singleton.class) { if (instance ==...

    简单谈谈php延迟静态绑定

    现在,`static`关键字会根据`AClass::create()`和`BClass::create()`的调用上下文,分别解析为`AClass`和`BClass`,从而正确地创建这两个子类的实例。 延迟静态绑定的这种行为对于实现工厂模式、单例模式以及其他...

    DCCouncil-law-static-assets:包含合作伙伴静态资产(css,js,...)

    接下来,我们谈谈JavaScript(JS),这是一种广泛用于客户端Web开发的脚本语言。JavaScript允许在用户与网页交互时进行动态内容更新,比如表单验证、动画效果、交互式界面等。在"DCCouncil-law-static-assets"中,JS...

    谈谈为何iOS开发别用宏来定义常量

    在定义全局常量时,最佳实践是在`Header`文件(`.h`)中声明`extern`常量,并在对应的`Implementation`文件(`.m`)中定义它们,使用`static const`。这样做既能确保常量的作用域限制,又能方便其他文件引用。例如:...

    java程序员必知的

    第一,谈谈final, finally, finalize的区别。  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是 Object类的一个方法...

    谈谈C++中的单例

    static Foo* _instance; Foo() {} // other members public: static Foo* getInstance() { if (_instance == NULL) { _instance = new Foo(); } return _instance; } ~Foo() { // clean codes } // ...

Global site tag (gtag.js) - Google Analytics