精华内容
下载资源
问答
  • 使用java.util.Date类只需创建一个新的Date()对象即可获得当前的日期和时间。 使用以下Java程序,此程序,我们还使用DateTimeFormatter类以根据需要以适当的格式显示结果。import java.text.Dat...

    有多种方法可以使用Java编程语言获取当前日期和时间。 这里我们将讨论使用java.util.Date和java.util.Calendar类的两种方法。

    使用java.util.Date类

    只需创建一个新的Date()对象即可获得当前的日期和时间。 使用以下Java程序,在此程序中,我们还使用DateTimeFormatter类以根据需要以适当的格式显示结果。

    import java.text.DateFormat;

    import java.text.SimpleDateFormat;

    import java.time.format.DateTimeFormatter;

    import java.util.Calendar;

    import java.util.Date;

    public class GetDateTime{

    public static void main( String[] args ){

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

    Date date = new Date();

    System.out.println(dateFormat.format(date));

    }

    }

    输出如下:

    linuxidc@linuxidc:~/linuxidc.com$ java linuxidc.com.java

    05/21/2019 07:41:03

    5b0ea86e313e19b9ae8de4614ef5c949.png

    使用java.util.Calendar类

    使用Calendar类中的Calendar.getInstance()函数。 这提供了操作日历字段的选项,例如获取下周或下个月的日期等。

    您还可以使用上面的日期时间格式类和以下示例。

    import java.util.Calendar;

    public class GetDateTime{

    public static void main( String[] args ){

    Calendar cal = Calendar.getInstance();

    System.out.println(cal.getTime());

    }

    }

    输出如下:

    linuxidc@linuxidc:~/linuxidc.com$ java linuxidc.com.java

    05/21/2019 07:55:09

    ebdb7f4b58235f9f3893669df72aacd8.png

    使用Calendar类,您还可以查找过去或将来的日期和时间。 例如,当前日期的10天之后或之前的日期是什么。 同样,我们也可以在数年,数月,数小时,分钟和秒数内做同样的事情。 请在下面找到一个示例Java程序。

    import java.util.Calendar;

    public class GetDateTime{

    public static void main( String[] args ){

    Calendar cal = Calendar.getInstance();

    System.out.println("Current Date & Time: " + cal.getTime());

    cal.add(Calendar.DATE, +10);

    System.out.println("Date after 10 days: " + cal.getTime());

    cal.add(Calendar.DATE, -10);

    System.out.println("Date before 10 days: " + cal.getTime());

    cal.add(Calendar.MONTH, 1);

    System.out.println("Date after 1 month: " + cal.getTime());

    cal.add(Calendar.YEAR, 5);

    System.out.println("Date after 5 years: " + cal.getTime());

    }

    }

    输出如下:

    linuxidc@linuxidc:~/linuxidc.com$ java linuxidc.com.java

    Current Date & Time: Tue May 21 07:58:33 CDT 2019

    Date after 10 days: Fri May 31 07:58:33 CDT 2019

    Date before 10 days: Tue May 21 07:58:33 CDT 2019

    Date after 1 month: Fri Jun 21 07:58:33 CDT 2019

    Date after 5 years: Fri Jun 21 07:58:33 CDT 2024

    37196de3ef6c9a4b49d37cbed73eb86a.png

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 多态 Java 中的实现

    2017-11-06 15:56:55
    C++ 和 Java 作为当前最为流行两种面向对象编程语言,其内部对于多态支持到底是如何实现的呢,本文对此做了全面介绍。 注意到本文,指针和引用会互换使用,它们仅是一个抽象概念,表示和另一个对象连接...

    Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用接口引用调用的实现则有所不同。总体而言,当某个方法被调用时,JVM 首先要查找相应的常量池,得到方法的符号引用,并查找调用类的方法表以确定该方法的直接引用,最后才真正调用该方法。以下分别对该过程中涉及到的相关部分做详细介绍。

    JVM 的结构

    典型的 Java 虚拟机的运行时结构如下图所示
    图 1.JVM 运行时结构
    这里写图片描述

    此结构中,我们只探讨和本文密切相关的方法区 (method area)。当程序运行需要某个类的定义时,载入子系统 (class loader subsystem) 装入所需的 class 文件,并在内部建立该类的类型信息,这个类型信息就存贮在方法区。类型信息一般包括该类的方法代码、类变量、成员变量的定义等等。可以说,类型信息就是类的 Java 文件在运行时的内部结构,包含了该类的所有在 Java 文件中定义的信息。

    注意到,该类型信息和 class 对象是不同的。class 对象是 JVM 在载入某个类后于堆 (heap) 中创建的代表该类的对象,可以通过该 class 对象访问到该类型信息。比如最典型的应用,在 Java 反射中应用 class 对象访问到该类支持的所有方法,定义的成员变量等等。可以想象,JVM 在类型信息和 class 对象中维护着它们彼此的引用以便互相访问。两者的关系可以类比于进程对象与真正的进程之间的关系。

    Java 的方法调用方式

    Java 的方法调用有两类,动态方法调用与静态方法调用。静态方法调用是指对于类的静态方法的调用方式,是静态绑定的;而动态方法调用需要有方法调用所作用的对象,是动态绑定的。类调用 (invokestatic) 是在编译时刻就已经确定好具体调用方法的情况,而实例调用 (invokevirtual) 则是在调用的时候才确定具体的调用方法,这就是动态绑定,也是多态要解决的核心问题。

    JVM 的方法调用指令有四个,分别是 invokestatic,invokespecial,invokesvirtual 和 invokeinterface。前两个是静态绑定,后两个是动态绑定的。本文也可以说是对于 JVM 后两种调用实现的考察。

    常量池(constant pool)

    常量池中保存的是一个 Java 类引用的一些常量信息,包含一些字符串常量及对于类的符号引用信息等。Java 代码编译生成的类文件中的常量池是静态常量池,当类被载入到虚拟机内部的时候,在内存中产生类的常量池叫运行时常量池。
    常量池在逻辑上可以分成多个表,每个表包含一类的常量信息,本文只探讨对于 Java 调用相关的常量池表。
    CONSTANT_Utf8_info
    字符串常量表,该表包含该类所使用的所有字符串常量,比如代码中的字符串引用、引用的类名、方法的名字、其他引用的类与方法的字符串描述等等。其余常量池表中所涉及到的任何常量字符串都被索引至该表。
    CONSTANT_Class_info
    类信息表,包含任何被引用的类或接口的符号引用,每一个条目主要包含一个索引,指向 CONSTANT_Utf8_info 表,表示该类或接口的全限定名。
    CONSTANT_NameAndType_info
    名字类型表,包含引用的任意方法或字段的名称和描述符信息在字符串常量表中的索引。
    CONSTANT_InterfaceMethodref_info
    接口方法引用表,包含引用的任何接口方法的描述信息,主要包括类信息索引和名字类型索引。
    CONSTANT_Methodref_info
    类方法引用表,包含引用的任何类型方法的描述信息,主要包括类信息索引和名字类型索引。
    图 2. 常量池各表的关系
    这里写图片描述

    可以看到,给定任意一个方法的索引,在常量池中找到对应的条目后,可以得到该方法的类索引(class_index)和名字类型索引 (name_and_type_index), 进而得到该方法所属的类型信息和名称及描述符信息(参数,返回值等)。注意到所有的常量字符串都是存储在 CONSTANT_Utf8_info 中供其他表索引的。

    方法表与方法调用

    方法表是动态调用的核心,也是 Java 实现动态调用的主要方式。它被存储于方法区中的类型信息,包含有该类型所定义的所有方法及指向这些方法代码的指针,注意这些具体的方法代码可能是被覆写的方法,也可能是继承自基类的方法。
    如有类定义 Person, Girl, Boy,

    class Person { 
    public String toString(){ 
       return "I'm a person."; 
        } 
    public void eat(){} 
    public void speak(){} 
    
    } 
    
    class Boy extends Person{ 
    public String toString(){ 
       return "I'm a boy"; 
        } 
    public void speak(){} 
    public void fight(){} 
    } 
    
    class Girl extends Person{ 
    public String toString(){ 
       return "I'm a girl"; 
        } 
    public void speak(){} 
    public void sing(){} 
    }

    当这三个类被载入到 Java 虚拟机之后,方法区中就包含了各自的类的信息。Girl 和 Boy 在方法区中的方法表可表示如下:
    图 3.Boy 和 Girl 的方法表
    这里写图片描述

    可以看到,Girl 和 Boy 的方法表包含继承自 Object 的方法,继承自直接父类 Person 的方法及各自新定义的方法。注意方法表条目指向的具体的方法地址,如 Girl 的继承自 Object 的方法中,只有 toString() 指向自己的实现(Girl 的方法代码),其余皆指向 Object 的方法代码;其继承自于 Person 的方法 eat() 和 speak() 分别指向 Person 的方法实现和本身的实现。
    Person 或 Object 的任意一个方法,在它们的方法表和其子类 Girl 和 Boy 的方法表中的位置 (index) 是一样的。这样 JVM 在调用实例方法其实只需要指定调用方法表中的第几个方法即可。
    如调用如下:

    class Party{ 
    …
     void happyHour(){ 
     Person girl = new Girl(); 
     girl.speak(); 
    …
         } 
     }

    当编译 Party 类的时候,生成 girl.speak()的方法调用假设为:
    Invokevirtual #12
    设该调用代码对应着 girl.speak(); #12 是 Party 类的常量池的索引。JVM 执行该调用指令的过程如下所示:
    图 4. 解析调用过程
    这里写图片描述

    JVM 首先查看 Party 的常量池索引为 12 的条目(应为 CONSTANT_Methodref_info 类型,可视为方法调用的符号引用),进一步查看常量池(CONSTANT_Class_info,CONSTANT_NameAndType_info ,CONSTANT_Utf8_info)可得出要调用的方法是 Person 的 speak 方法(注意引用 girl 是其基类 Person 类型),查看 Person 的方法表,得出 speak 方法在该方法表中的偏移量 15(offset),这就是该方法调用的直接引用。
    当解析出方法调用的直接引用后(方法表偏移量 15),JVM 执行真正的方法调用:根据实例方法调用的参数 this 得到具体的对象(即 girl 所指向的位于堆中的对象),据此得到该对象对应的方法表 (Girl 的方法表 ),进而调用方法表中的某个偏移量所指向的方法(Girl 的 speak() 方法的实现)。

    接口调用

    因为 Java 类是可以同时实现多个接口的,而当用接口引用调用某个方法的时候,情况就有所不同了。Java 允许一个类实现多个接口,从某种意义上来说相当于多继承,这样同样的方法在基类和派生类的方法表的位置就可能不一样了。

    interface IDance{ 
       void dance(); 
     } 
    
     class Person { 
     public String toString(){ 
       return "I'm a person."; 
         } 
     public void eat(){} 
     public void speak(){} 
    
     } 
    
     class Dancer extends Person 
     implements IDance { 
     public String toString(){ 
       return "I'm a dancer."; 
         } 
     public void dance(){} 
     } 
    
     class Snake implements IDance{ 
     public String toString(){ 
       return "A snake."; 
         } 
     public void dance(){ 
     //snake dance 
         } 
     }

    图 5.Dancer 的方法表
    这里写图片描述

    可以看到,由于接口的介入,继承自于接口 IDance 的方法 dance()在类 Dancer 和 Snake 的方法表中的位置已经不一样了,显然我们无法通过给出方法表的偏移量来正确调用 Dancer 和 Snake 的这个方法。这也是 Java 中调用接口方法有其专有的调用指令(invokeinterface)的原因。
    Java 对于接口方法的调用是采用搜索方法表的方式,对如下的方法调用
    invokeinterface #13
    JVM 首先查看常量池,确定方法调用的符号引用(名称、返回值等等),然后利用 this 指向的实例得到该实例的方法表,进而搜索方法表来找到合适的方法地址。
    因为每次接口调用都要搜索方法表,所以从效率上来说,接口方法的调用总是慢于类方法的调用的。


    https://www.ibm.com/developerworks/cn/java/j-lo-polymorph/

    展开全文
  • java中分页的实现

    2020-08-19 14:37:47
    java中分页功能的实现.直接调用即可.这个插件原理就是你只要给他一个需要分页集合,分页数,每页条数,然后回调函数返回总条数,当前页码,每页数据集合,每页条数,后台只需要调用即可。
  • 在Java中实现时间动态显示有不少种方法。下面就介绍其中一种简单方法给你们。javaSwing中的计时器Timer,主要用到javax.swing.*包下Timer类,该类能够周期触发ActionEvent事件。ide什么都不说,直接上代码...

    在Java中要实现时间的动态显示有不少种方法。下面就介绍其中一种简单的方法给你们。java

    Swing中的计时器Timer,主要用到javax.swing.*包下的Timer类,该类能够周期的触发ActionEvent事件。ide

    什么都不说,直接上代码:3d

    private Timer time;

    //时间显示

    private JLabel getTimelabel() {

    if (timelabel == null) {

    timelabel = new JLabel("");

    timelabel.setBounds(5, 65, 200, 20);

    timelabel.setFont(new Font("微软雅黑", Font.BOLD, 12));

    timelabel.setForeground(new Color(182, 229, 248));

    time = new Timer(1000,new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent arg0) {

    timelabel.setText(new SimpleDateFormat("yyyy年MM月dd日 EEEE hh:mm:ss").format(new Date()));

    }

    });

    time.start();

    }

    return timelabel;

    }

    Timer能够经过start()方法来启动,stop()方法既是中止Timer。code

    时间代码:orm

    timelabel.setText(new SimpleDateFormat("yyyy年MM月dd日 EEEE hh:mm:ss").format(new Date()));

    时间动态显示的主要代码:blog

    time = new Timer(1000,new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent arg0) {

    timelabel.setText(new SimpleDateFormat("yyyy年MM月dd日 EEEE hh:mm:ss").format(new Date()));

    }

    });

    time.start();

    最终在界面中的显示结果为:事件

    d9cbda9f562f936f50d960d70c4b21ea.png

    展开全文
  • 获得文本框中当前光标位置这个可以通过getCaretPosition()方法得到2.输出文本到当前位置这个分为两个步骤:1.拼接字符串 2.输出如:// 获得当前光标位置int cur = show.getCaretPosition();// 得到光标之后字符串...

    我的理解有2个问题要解决:

    1.获得文本框中当前光标的位置

    这个可以通过getCaretPosition()方法得到

    2.输出文本到当前位置

    这个分为两个步骤:1.拼接字符串 2.输出

    如:// 获得当前光标位置

    int cur = show.getCaretPosition();

    // 得到光标之后的字符串

    String tailString = show.getText().substring(cur);

    // 得到光标之前的字符串

    String headString = show.getText().substring(0.cur);

    // 拼接字符串 并输出

    textfield1.setText(headString + 输出的内容 + tailString);

    下面的代码是一个简单的测试

    import java.awt.Container;

    import java.awt.event.FocusEvent;

    import java.awt.event.FocusListener;

    import javax.swing.JFrame;

    import javax.swing.JTextField;

    public class TextTest {

    /**

    * @param args

    */

    public static void main(String[] args) {

    JFrame frame = new JFrame("文本输出测试");

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setSize(400, 300);

    // 添加文本框

    Container container = frame.getContentPane();

    final JTextField show = new JTextField("文本|这里是光标为位置|内容");

    container.add(show);

    // 文本框获得当前光标焦点

    show.addFocusListener(new FocusListener() {

    @Override

    public void focusLost(FocusEvent e) {}

    @Override

    public void focusGained(FocusEvent e) {

    // TODO Auto-generated method stub

    // 设置当前光标位置

    show.setCaretPosition(12);

    // 启动一个线程输出

    new Thread() {

    @Override

    public void run() {

    int cur = show.getCaretPosition();

    String tailString = show.getText().substring(cur);

    int loop = 1;

    while(loop < 10){

    show.setText(show.getText().substring(0, cur) + loop + " " + tailString);

    show.setCaretPosition(cur + 2);

    cur = show.getCaretPosition();

    loop++;

    try {

    Thread.sleep(2000);

    } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    }.start();

    }

    });

    frame.setVisible(true);

    }

    }

    屏幕结果:

    文本|这里是光标为位置|1内容

    文本|这里是光标为位置|1 2内容

    文本|这里是光标为位置|1 2 3内容

    文本|这里是光标为位置|1 2 3 4内容

    文本|这里是光标为位置|1 2 3 4 59内容

    文本|这里是光标为位置|1 2 3 4 5 6内容

    文本|这里是光标为位置|1 2 3 4 5 6 7内容

    文本|这里是光标为位置|1 2 3 4 5 6 7 8内容

    文本|这里是光标为位置|1 2 3 4 5 6 7 8 9内容

    2010年11月16日 18:00

    展开全文
  • 今天给大家带来的是Java中Date类的使用,java.util 包提供了 Date类来封装当前的日期和时间知识点:Date 类提供两个构造函数来实例化 Date 对象第一个构造函数使用当前日期和时间来初始化对象Date( )第二个构造函数...
  • 前几天,技术群里有个群友问了一个关于线程池问题,内容如图所示:关于...那么就来和大家探讨下这个问题,线程池,线程会从 workQueue 读取任务来执行,最小执行单位就是 Worker,Worker 实现了 Runn...
  • 为了克服当前Web应用开发技术种种弊端,文章将传统面向对象编程模型--MVC模型引入Web应用程序开发,并使用以Java为核心技术对其进行具体实现
  • 存在即合理在java中,每个对象都有两个池,锁池(monitor)和等待池(waitset),每个对象又都有wait、notify、notifyAll方法,使用它们可以实现线程之间通信,只是平时用较少。wait(): 使当前线程...
  • 实现当前日历打印,当前日期用*来表示。关键得出这个月第一天是星期几。基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7公式d表示日期中的日数+1,m表示月份数,y表示年数。注意1:公式...
  • 进入Eclipse后,创建一个新的Java项目并为其命名。确认名称之前,请注意,您要创建的项目是针对稍后将要实现的实际API的。3。创建项目后,请确保您可以项目浏览器窗口看到它。此步骤是确保您不会将任何其他...
  • 看到很多人都询问怎么在java swing只关闭当前的窗体,因此写下此文。主界面主要是有两个jbutton,一个是通过按钮事件调起另一个jfame,另一个是关闭当前窗体。1、关闭当前窗体不能使用setdefaultcloseoperation...
  • 在Java 8接口添加静态方法带来了一个限制 : 这些方法不能由实现类继承。   这样做是有道理,因为一个类可以实现多个接口。如果2个接口具有相同静态方法,它们都将被继承,编译器就不知道要调用...
  • 进入Eclipse后,创建一个新的Java项目并为其命名。确认名称之前,请注意,您要创建的项目是针对稍后将要实现的实际API的。3。创建项目后,请确保您可以项目浏览器窗口看到它。此步骤是确保您不会将任何其他...
  • MainTest类中的main方法输入以下代码:public static void main(String[] args) {Calendar c = Calendar.getInstance(); //获取日历实例对象System.out.println(c);//讲日历对象打印输出System.out.println(...
  • 实现当前日历打印,当前日期用*来表示。关键得出这个月第一天是星期几。基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7公式d表示日期中的日数+1,m表示月份数。y表示年数。注意1:公式...
  • C++ 和 Java 作为当前最为流行两种面向对象编程语言,其内部对于多态支持到底是如何实现的呢,本文对此做了全面介绍。注意到本文,指针和引用会互换使用,它们仅是一个抽象概念,表示和另一个对象连接...
  • BooleanLock是Lock的一个Boolean实现,通过控制一个Boolean变量的开关来决定是否允许当前的线程获取该锁,首先定义三个非常重要的成员变量,如下所示:package com.wangwenjun.concurrent.chapter05;import java....
  • 1.首先前端利用表单收集用户个人信息,由于网页显示数据时以字符串显示,后台Servlet获取时,有内置HttpServletRequest类,进行实例化后request对象调用 getParameter()方法可获取前端输入信息,...
  • 有时需要在java程序打开一个文件。java.awt.Desktop可用于在java中打开文件。Desktop实现依赖于平台,因此首先,应该检查操作系统是否支持Desktop类。此类查找注册到当前平台关联应用程序以打开文件。我们来看看...
  • 红黑树又叫做自平衡二叉查找树,由于其稳定查找特性,红黑树在Java中有广泛应用——例如我们将要讲解TreeMap容器和当前讲解HashMap容器中都有对红黑树应用。红黑树操作原理相对于我们已经讲解过堆树要...
  • 看到很多人都询问怎么在java swing只关闭当前的窗体,因此写下此文。主界面主要是有两个jbutton,一个是通过按钮事件调起另一个jfame,另一个是关闭当前窗体。1、关闭当前窗体不能使用setdefaultcloseoperation...
  • 一、背景想自己开发项目上加一个...因此开始学习如何实现学习过程发现需要写一个方法用来找到指定接口的实现类,因此开启了这趟学习之旅。策略模式改进文章:通过反射机制实现一个完美策略模式二、...
  • 多态在 Java 和 C++ 编程...本文主要探讨多态在当前最流行两种编程语言 C++ 和 Java 中的实现,并对其中异同进行了比较,使读者对其有全面理解,以便更好在编程正确使用这种特性。 3 评论 刘 冠群, 软

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,868
精华内容 3,147
关键字:

在当前的java实现中

java 订阅