Posts

Showing posts from March, 2018

成员初始化

Java尽力保证:所有变量在使用前都能够得到恰当的初始化 文章目录 ⚜未初始化 ⚜指定初始化 ⚜构造器初始化 ⚜初始化引用 ⚜初始化顺序 ⚜对象的创建过程 ⚜总结 未初始化 Java尽力保证所有变量在使用前都能得到恰当的初始化 对于方法的局部变量 如果没有初始化局部变量,使用时Java将以编译时错误的形式提醒我们进行初始化 对于类的数据成员 (/字段/域)  如果没有初始化数据成员,编译器会给数据成员赋上初值(对数字来说就是0,布尔值为false,char为[],之后会讲到原因),如果数据成员是对象引用,那么此引用会获得一个特殊值null 尽管这种方法效率似乎不高,但它的确能使初始化得到保证 指定初始化 如果想为某个变量赋值, 指定初始化是(优点)一种直观又简便的办法(在定义类成员变量的地方为其赋值) 注意: 如果没有为对象引用指定初值就尝试使用它,就会出现运行时错误 ”向前引用“会出现编译时错误,也就是说 在定义字段之前不能引用该字段 指定初始化(缺点)有一个限制,类的每个对象中使用指定初始化的字段都有相同的初始值 有时这正是我们所希望的, 但有时我们需要更大的灵活性,这时我们需要使用构造初始化 构造器初始化 构造器初始化这种说法已经足够直观,无需赘述。 其中需要注意的是:我们无法阻止自动初始化的进行,它将在构造器被调用之前发生。 初始化引用 就像我们之前提到的那样,编译器并不是简单地为每一个引用都创建默认对象,如果那么做的话,就会在很多情况下增加不必要的负担。 如果想初始化这些引用,可以在代码中的下列位置进行: 在定义对象的地方。这意味着它们总能够在构造器调用之前被初始化(指定初始化,下节会讲到初始化顺序) 在类的构造器中(构造器初始化) 就在正要使用这些对象之前,这种方式称为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。 使用实例初始化 初始化顺序 此节是本文的重点,我会在下面讲到初始化的顺序并会分析其原因,不过首先我们需要对static和继承有着基础的认识: static 说到初始化

Java对象的排序查找及比较

在我们的编程过程中自然避免不了与排序打交道,而Java语言提供了排序算法的封装(包括数组排序和集合排序),对其底层实现感兴趣的同学可以查看其源代码(虽然Java内置了排序方法,学习排序方法还是很有必要的,正如我曾经看到的一个非十分恰当的比喻,如今已经有各种代步工具,但我们还是要从走路学起。何况众算法各有各的优势,多掌握一种算法就多了一种选择),除了排序之外本文还会讲到查找的知识(二分法查找),当然,此查找也是内置方法。至于比较则是本文的重点内容,其比较的定义决定了元素的排序方式。 Arrays类,数组的排序及查找 成员: public static void sort(List list); public static void sort(List list,Comparator c); public static int binarySearch(List list,Object key); public static int binarySearch(List list,Object key,Comparator c); Arrays.asList(10,7,6,5,9)方法可以直接得到一个List对象 Arrays类提供了sort(),binarySearch()静态方法 执行binarySearch()之前应调用sort() 例: String[] s={.....}; Arrays.<String>sort(s); Arrays.<String>binarySearch(s,x); //x为想要查找的元素 Collectsions类,集合的排序及查找 成员: public static void sort(List list);   //Comparable接口 public static void sort(List list,Comparator c);   //Comparator接口 public static int binarySearch(List list,Object key);   //Comparable接口 public static int binarySearch(L

抓包工具Wireshark下载及安装教程

Image
下载 点击 这里 根据自己的系统选择版本进行下载 安装步骤 执行安装程序后进入欢迎界面,直接next 同意条款并next 这一步wireshark会询问我们需要安装哪些程序组件。我们可以选择性的安装我们必须的一些wireshark附带的工具, 通常使用到的有:wireshark主程序( 图形界面 )、TSshark(基于 命令行 的)、plugins/extensions(wireshark以及TSshark的一些扩展插件) 等..., 不清楚需要什么组件就全选,文件本身不大 所示在此界面wireshark安装程序会询问我们一些配置问题,其中是 wireshark(中文版);另外一个是wireshark legacy (英文版)。如图: ①Start Menu Item :开始菜单;②Desktop Icon:桌面快捷方式;③Quick Launch Icon:任务栏;之后的单选按钮选择 是否关联所列出的后缀名文件。 之后wireshark询问 我们的安装位置,根据需要选择。 然后就是询问我们是否安装依赖软件WinPcap(该软件主要用于捕获网络底层数据包 ),假如你的电脑上已经安装了该软件,那么我们可以取消掉该软件的安装。对于windows系统(特别是win10)我们有更好的选择----Nmap,下载地址在 这里 。 安装WinPcap过程中安装程序询问我们是否开机自动启动WinPcap驱动程序。选择是就好。 至于软件USBPcap,根据需要下载,更多信息点击 这里 。 之后一路next!!(莽就对了) 恭喜你安装完成! 总结 本文只作学习交流之用,转载请注明出处。 https://danserlesgens.blogspot.com/2018/03/wireshark.html

final关键字

  final的含义为“不可改变的”,不想做改变通常有两种理由:设计或效率,下面谈论了可能使用到final的三种情况:域,方法和类 final域 将数据声明为final是因为需要一个: 一个永不改变的编译时常量 一个在运行时被初始化的值,而你不希望它被改变 在这里附上运行时/编译时的定义,了解可以跳过:  Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用   的类型决定,运行时类型由实际赋给该变量的对象决定。   Person p=new Women()(Women类继承自Person类)那么,假如p的属性修饰符为public 那么访问属性时得到 的是Person类的属性还是Women类的属性?方法调用又是哪个类?   答案:会得到Person类的属性,调用  Women类的方法。为什么会这样呢?这里就需要知道什么是编译时类型和运行时类型,Java程序状态会分为编译和运行这两种状态,编译时,JVM会在栈中静态创建基本数据变量,和引用数据变量的引用。回到刚刚那句代码,显然,p这个引用就是在编译时创建的。那么,p的编译时类型就是Person了,当运行这句java代码时,JVM在堆中为p新建一块内存,对应new Women()这句代码,所以p的运行时类型就是Women 编译时常量存在什么样的风险?   编译时常量,在使用时会被直接写成值,而不会再从原来的类中读取。这样就会导致问题的产生:如果   A类定义了常量,B类使用了常量,并且都进行了编译。当A类的源码被改动了,常量的值发生了变化。我们对A类进行了重新编译,但是没有对B类进行重新编译;那么B类中用到的是原来A类中的常量值,即旧值。这就导致了风险的发生。  对于编译时常量(static final修饰,根据惯例编译时常量用大写表示,并使用下划线分隔各个单词)这种情况,编译器可以将常量带入任何可能用到它的计算式中,在编译时执行计算式,这减轻了一些运行时负担。在Java中,这类常量必须是基本数据类型,再对其定义的同时必须进行赋值。编译时常量只占据一个一段不能改变的储存空间。 而对 对象引用使用final时,引用指向恒定不变,然而对象自身却是可以被修改的( 可以使用 单例模式 以取得对象恒

序列号

      引:Java支持序列化机制,它可以将任何对象写出到输出流中,并在之后将其读回。但是,有一种重要的情况需要考虑:当一个对象被多个对象共享,作为他们各自状态的一部分时,会对序列化反序列化造成什么影响呢? ps:为了更清楚的理解以下知识,首先要对 类,对象,引用,序列化与反序列化的概念有着清晰的认识  序列号是什么 每个被序列化的对象都拥有一个序列号,这也是这种机制被称为序列化的原因。 序列化和反序列化的具体过程 写出对象: 对你遇到的每一个对象引用都关联一个序列号 对于每个对象,当第一次遇到时,保存其对象数据到输出流中 如果某个对象之前已经被保存过,那么只写出“与之前保存过的序列号为X的对象相同”作为标记 读回对象: //在读回对象时,整个过程是反过来的 对于对象输入流中的对象,在第一次遇到其序列号时,构建它,并使用流中的数据来初始化它,然后记录这个序列号和新对象之间的关联 当遇到“与之前保存过的序列号为X的对象相同”标记时,获取与这个顺序号相关联的对象引用 序列号的作用 当一个对象被多个对象共享,保存这样的对象网络是一种挑战,我们当然不可能去保存和恢复这个对象网络的内存地址,因为当对象被重新加载时,它可能占据的是与原来不同的内存地址。 让每个对象都用序列号来保存解决了这个问题,因为序列号代替了内存地址(正如在文件中保存原生的内存地址毫无意义一样,这些地址对于在不同的处理器之间的通信也是毫无意义的),所以同时它也允许了将对象集合从一台机器传送到另一台机器。 总结 本文之作学习交流之用,转载请注明出处。

Java中Synchronized的用法

原文: http://blog.csdn.net/luoweifu/article/details/46613015   作者: luoweifu   本文将讲到Java线程同步中的一个重要的概念synchronized. synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; 4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。 修饰一个代码块 一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。我们看下面一个例子: 【Demo1】:synchronized的用法 /** * 同步线程 */ class SyncThread implements Runnable { private static int count; public SyncThread () { count = 0 ; } public void run () { synchronized ( this ) { for ( int i = 0 ; i < 5 ; i++) { try { System.out.println(Thread.currentThread().getName() + ":" + (count++)); Thread.sleep( 100 ); } catch (InterruptedException e) { e.printStackTrace(); } }