静态类和静态方法

静态类和静态方法

如果一个类要被声明为static的,只有一种情况,就是静态内部类。

静态内部类实际上与普通类(即类名必须与文件名一样的顶级类)一样,只是静态内部类在某一类的内部定义了而已,既然是类,要想使用就必须实例化。概念上与静态变量、静态方法是不一样的,不要被“静态”两个字迷惑了(不要以为凡是静态的东西就不需要实例化就可以直接使用,静态内部类是有区别),而且只有静态内部类,而没有静态类(顶级类)的概念。

例子:

public class Singleton{

private Singleton(){}

private static class SingletonHolder{

private final static Singleton instance;

}

public Singleton getInstance(){
return SingletonHolder.instance;
}
}

静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。静态方法中也不能使用关键字this。

倒排索引

Inverted Index

如果翻译成转置索引可能更好懂,它就相当于做了矩阵转置。

倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

反射

反射API中提供的动态代理也是非常强大的功能,可以原生实现AOP中 的方法拦截功能。正如英文单词reflection的含义一样,使用反射API的时候就好像在看一个Java类在水中的倒影一样。知道了Java类的内部 结构之后,就可以与它进行交互,包括创建新的对象和调用对象中的方法等。

这种交互方式与直接在源代码中使用的效果是相同的,但是又额外提供了运行时刻的灵活性。使用反射的一个最大的弊端是性能比较差。相同的操作,用反射API所需的时间大概比直接的使用要慢一两个数量级。不过现在的JVM实现中,反射操作的性能已经有了很大的提升。

Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。

枚举类型

Enumerated Type

enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
    由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。

多线程

Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:

1、可以避免由于Java的单继承特性而带来的局限;
2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;
3、适合多个相同程序代码的线程区处理同一资源的情况。

下面是通过实现Runnable接口实现的多线程程序,代码如下:

lass MyThread implemments Runnable{
private int ticket =5;
public void run(){
for(int i=0;i<10;i++){
if(ticket>0){
System.out.println("ticket="+ticket--);
}}}}

public class RunnableDemo{
public static void main (String[] args){
MyThread my = new MyThread();
new Thread(my).start();
new Thread(my).start();
new Thread(my).start();
}}

多路归并算法

归并排序也是一种使用分治法来实现的有效排序算法,它是现代计算机创始人John von Neumann于1945年发明的。

归并排序在众多排序算法中既是稳定排序,又有不错的效率,同时,归并排序不仅可以用于内排序,还可以用于外排序。

归并排序的思路如下(以二路归并为例):

将数组划均分为两个子数组;
对两个字数组进行排序;
将排序好的两个字数组归并。
所谓 N路归并 是指将数组均分为N个子数组,将字数组排序后再归并。因此二路归并是归并排序的最一般的情况。

例子:

def msort(array):
length=len(array)
if length ==1;
return array
else:
mid=length/2
left = msort(array[0:mid)
right = msort(array[mid:length])
return merge(left,right)

非递归

def msort(array)
step=1
while step<length:
for left in range(0,length-step,2*step):
result=merge(array[left:left+step]),
array[left+step:min(left+2*step,length)])
array=array[0:left]+result+array[min(left+2*step,length)]
step=step*2
return array

def merge(left,right):
llen=len(left)
lcur=0
rlen=len(right)
rcur=0
result=[]
while lcur<llen and rcur<rlen:
lone= left[lcur]
rone=right[rone]
result.append{min(lone,rone)}
if lone<rone:
lcur+=1
else:
rcur+=1
result+=lefte[lcur:]
result+=right[rcur:]
return result

文章转载自  乐橙谷http://www.lechenggu.com/bbs/topic/57fdb5c19c73a464f54e7574
时间: 2024-08-27 19:08:12

静态类和静态方法的相关文章

C#中静态类、静态方法和静态变量的简单说明

静态方法与静态变量一样,属于类本身,而不属于哪个类的一个对象.调用一个被定义为static的方法,只有通过在它前面加上这个类的名称.一般定义里说是可以通过实例调用的.其他语言我还没测试,但是在C#中是不行的,只能通过类型名称引用它(静态变量也是哦). 1 class Class1 2 { 3 public static string No { set; get; } 4 public string Second { set; get; } 5 6 public static void Wmt()

静态类、静态方法、静态成员和实例成员的比较

任何项目中都会使用到静态类.静态方法.静态成员和实例成员了.那么这几个名词到底有哪些区别呢? 1.静态成员和实例成员 静态成员:静态成员通常和类是相关联的.它可以作为类中公有的变量,不依赖特定对象的存在.通常我们在访问它们的时候很简单,直接通过类名加点操作符再加变量名来进行操作. 实例成员:实例成员通过和对象是相关联的.一般情况下,我们都是对类的实例化来进行访问操作.如果实例不存在,那么也就无法访问实例成员对象. 所以实例成员的存在必须要有对象实例的存在,如果对象实例都不存在了,那么就将无法访问

(转)Java静态变量,静态类,静态方法

静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                                        非静态对象     拥有属性:                是类共同拥有的                                             是类各对象独立拥有的内存分配:               内存空间上是固定的   

关于Java的静态:静态类、静态方法、静态变量、静态块等

原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev 很少看到文章能把静态这个问题解释的很清楚,有些文章绕来绕去很复杂.这篇解释静态问题的小文通透而容易理解.所以我把它翻译一下,让大家能好好理解关于静态. 其实对于Java静态的引入,考虑目标是使用和运行的便捷,不需要再实例化,特别是一些工具性质的代码段.当不用再实例化时,就可以相当于直接使用,增加了公共代码复用的便捷性. 从Java8开始,还

静态类和非静态类以及静态方法和非静态方法的区别

1.静态类中不能包括非静态成员,比如非静态方法.构造函数:非静态类中可以包括静态成员.如果不按照这种规则静态类编译器会检查报错. 简而言之就是:静态类中所有的成员必须是静态成员,但是静态成员不一定是在静态类中 . 2.静态类无法实例化,其成员可以直接使用:非静态类中的静态成员不需要实例化,可以直接使用,非静态类中的非静态成员必须实例化. 简而言之就是:不管在哪静态成员都不需要实例化其所在类,而非静态成员必须实例化其所在类. 3.静态成员之所以执行速度快,是因为其在编译的时候编译器放在了静态区(保

静态类、静态方法的使用

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _Test { class Program { static void Main(string[] args) { //调用实例成员 Person p = new Person(); p.M1();//实例方法,调用的时候必须创建实例对象. Per

静态类,静态方法,静态成员

官方文档: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members https://www.cnblogs.com/Matcha/p/5312268.html https://www.jianshu.com/p/e1fee3558cb6 原文地址:https://www.cnblogs.com/fuyou

用JAVASCRIPT实现静态对象、静态方法和静态属性

Javascript语言的面向对象特征很弱,其他面向对象语言在创建类时只要使用关键字static即可指定类为静态类,Javascript没有提供static这样的关键字,要让Javascript也具有"静态"特性只有靠一些"奇技淫巧"了. 代码中列举了两种静态方法/属性的实现方式,一种是静态类的静态方法和属性,另一种是非静态类的静态方法和属性,代码说明都写在每行的代码注释里,这里就不重复了. /************************************

java中的单例模式与静态类

单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在<Java中有关单例模式的面试问题>博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如,两者可以直接使用而无须创建对象,都可提交唯一实例,在一个非常高的高度上看起来它们都为是用于同样的任务.由于它们具有较多的相似性,面试官常常会问一些类似为神马使用单例模式替换静态方法?你能使用静态类替换单例模式吗?Java中单例模式与静态的区别有那些?等这样的问题,为回答这些问题,记住他们单例模式和静态方法