1 构造代码块

作用:给对象进行初始化。对象一建立就运行,并且优先于构造函数执行

构造函数是给所有对象进行统一初始化,构造函数是给对应的对象初始化

package package1;

class Person{
    private String name;

    {
        System.out.println("person code run");
    }

    Person(){
        System.out.println("name="+name);
        cry();
    }

    Person(String name){
        this.name = name;
        System.out.println("name="+name);
        cry();
    }

    public void cry(){
        System.out.println("crying");
    }
}

public class Test1 {
    public static void main(String[] args){
        Person p = new Person();
        Person p1 = new Person("tom");
    }
}

结果:

person code run
name=null
crying
person code run
name=tom

2 javadoc 注释文档的制作(以数组ArrayTool为例)

package package1;

/**
 * 这是一个对数组操作的工具类事例,提供最值,排序等功能
 * @author balfish_ac
 * @version V1.1
 *
 */

public class ArrayTool {
    private ArrayTool(){}

    /**
     * 获取最大值
     * @param arr 接收int类型的数组
     * @return 返回一个该数组中最大值
     */
    public static int getMax(int[] arr){
        int max = 0;
        for(int i=1; i<arr.length; i++){
            if(arr[i] > arr[max]){
                max = i;
            }
        }
        return arr[max];
    }

    /**
     * 选择排序
     * @param arr
     */
    public static void selectSort(int[] arr){
        for(int i=0; i<arr.length-1; i++){
            for(int j=i+1; j<arr.length; j++){
                if(arr[i] > arr[j]){
                    swap(arr,i,j);
                }
            }
        }
    }

    /**
     * 冒泡排序
     * @param arr
     */
    public static void bubbleSort(int[] arr){
        for(int i=0; i<arr.length-1; i++){
            for(int j=0; j<arr.length-i-1; j++){
                if(arr[j] > arr[i+1]){
                    swap(arr,j,j+1);
                }
            }
        }
    }
    /**
     * 位置置换
     * @param arr
     * @param a 要置换的位置
     * @param b 要置换的位置
     */
    private static void swap(int[] arr, int a, int b){
        int tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }

    /**
     * 打印数组中的元素
     * @param arr
     */
    public static void printArray(int[] arr){
        for(int i=0; i<arr.length; i++){

        }
    }

}

命令行:javadoc -d mydoc -author -version ArrayTool.java

myeclipse: 项目上点右键-export-java-javadoc  即可(自己选路径)

3 静态代码块 , 构造代码块 , 构造函数 的执行顺序

package package1;

class StaticCode{
    StaticCode(){
        System.out.println("b");
    }

    static{
        System.out.println("a");
    }

    {
        System.out.println("c");
    }

    StaticCode(int x){
        System.out.println("d");
    }

}

public class Test1 {
    public static void main(String[] args){
        StaticCode s = new StaticCode(1);
    }
}

运行结果:

a
c
d

静态代码块 > 构造代码块 > 构造函数

4 Person p = new Person("zhangsan",20);

这句话都做了什么事情?

(1)因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中

(2)执行该类中的static代码块,如果有的话,给Person.class类进行初始化

(3)在堆内存中开辟空间,分配内存地址

(4)在堆内存中建立对象的特有属性,并进行默认初始化

(5)对属性进行显示初始化

(6)对对象进行构造代码初始化

(7)对对象进行对应的构造函数初始化

(8)将内存地址赋给栈内存的p变量

5 内部类相关

static的内部类行为上象一个独立的类,非static的内部类在行为上类似类的属性或方法且禁止声明static的方法。
内部类可以访问外部类的所有方法与属性,但static的内部类只能访问外部类的静态属性与方法。
/*
 * 内部类的访问规则:
 * 1 内部类可以直接访问外部类中的成员,包括私有,
 *    之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式为 外部类名.this
 * 2 外部类要访问内部类,必须建立内部类对象

 */

package package1;

class Outer{
    private int x = 3;
    class Inner{
        int x = 4 ;
        void function(){
            int x = 6;
            System.out.println("Inner: "+Outer.this.x);
            System.out.println("Inner: "+x);
        }
    }

    void method(){
            Inner in = new Inner();
            in.function();
    }
}

public class Test8 {
    public static void main(String[] args){
        Outer out = new Outer();
        out.method();
        System.out.println("-------------------------");
        //直接访问内部类中的成员
        Outer.Inner in = new Outer().new Inner();
        in.function();

    }
}

运行结果:

Inner: 3
Inner: 6
-------------------------
Inner: 3
Inner: 6

6 Iterator迭代器相关

(1)Iterator迭代器只有next,hasNext,remove方法,如果要获得其他方法且(在List接口子类情况下) 可以使用子接口ListIterator

(2)迭代时不能够再访问迭代中的framework,由于迭代引用已经指向框架对象,再有操作会有同步问题

(3)在一次的Iterator的迭代过程中不要出现两次it.next(),原因见下程序

package package1;
import java.util.ArrayList;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList();
        al.add("java01");
        al.add("java02");
        al.add("java01");
        al.add("java02");
        al.add("java01");
//        al.add("java03");

        Iterator it = al.iterator();
        while(it.hasNext()){
            System.out.println(it.next() + "------" +  it.next());
        }
    }
}

运行结果:throw new NoSuchElementException(); 不是成对出现的,注释去掉可以运行通过  (正常取一次判断一次而现在是取两次才判断)

7 HashSet相关

注意Hash相关的集合框架要覆写equals和hashCode,一定要注意和Object的参数列表相同,否则不是覆写。

另外, 判重只有HashCode值相同,才会判断equals!!!

package package1;
import java.util.HashSet;
import java.util.Iterator;

/*
 * HashSet保证元素唯一性的方法是:hashCode和equals方法
 * 如果元素的HashCode值相同,才会判断equals是否为true
 */
class Person{
    private String name;
    private int age;
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    public String toString(){
        return "("+name+":"+age+")";
    }

    public int hashCode(){

        System.out.println(this.name+"...hashCode");
//        return 30;    标记1
        return name.hashCode() + age * 37;   //标记2
    }

    public boolean equals(Object obj){
        if(!(obj instanceof Person))
            return false;
        Person p = (Person)obj;
        System.out.println(this.name+ "...equals..." + p.name);
        return this.name.equals(p.name)&&this.age==p.age;
    }
}

public class Test {
    public static void main(String[] args) {
        HashSet<Person> hs = new HashSet<Person>();
        hs.add(new Person("a1",11));
        hs.add(new Person("a2",12));
        hs.add(new Person("a3",13));
        hs.add(new Person("a2",12));

        Iterator it = hs.iterator();
        while(it.hasNext()){
            Person p = (Person) it.next();
            System.out.println(p.getName() + "::" + p.getAge());
        }
    }
}

运行结果:

采用标记1:

a1...hashCode
a2...hashCode
a2...equals...a1
a3...hashCode
a3...equals...a2
a3...equals...a1
a2...hashCode
a2...equals...a3
a2...equals...a2
a3::13
a2::12
a1::11

采用标记2:

a1...hashCode
a2...hashCode
a3...hashCode
a2...hashCode
a2...equals...a2
a1::11
a3::13
a2::12

8 Arrays工具类的asList方法

把数组变成list集合,可以使用集合的思想和方法来操作数组中的元素

注意,使用asList时,不能使用集合的增删方法,因为数组的长度是固定的

而indexOf,contains,get什么的方法都没问题

package package1;

import java.util.Arrays;
import java.util.List;

public class Testhh {
     public static void main(String[] args) {
        String[] arr = {"abc" , "cc" , "kkkk"};    

        List<String> list = Arrays.asList(arr);
        System.out.println("contains:" + list.contains("cc"));

     //    list.add("qq"); //UnsupportedOperationException
        System.out.println(list);
     }
}

运行结果:

contains:true
[abc, cc, kkkk]

(若加注释抛出异常)

9 可变参数

其实就是数组参数的简写形式,不用每一次都手动建立数组对象,只要将要操作的元素作为参数传递即可,隐式地将参数封装为数组

注意:可变参数一定在参数列表的最后,防止冲突(放前面默认把后面的参数也当做可变参数接收 )

package package1;

public class Testhh {
     public static void main(String[] args) {
        /*
         int[] arr1 = {2,3,4};
         show(arr1);

         int[] arr2 ={2,3};
         show(arr2);
         */

         show(2,3,4);
         System.out.println("--------------------------");
         show(2,3,4,5,6,7);
     }

     /*
     public static void show(int[] arr){
         System.out.println(arr);
     }
     */

     public static void show(int... arr){
         for(int i=0 ; i<arr.length ; i++){
             System.out.println(arr[i]);
         }
     }

}

运行结果:

2
3
4
--------------------------
2
3
4
5
6
7

10 静态导入

如 import java.lang.System.*;  导入所有System类的静态成员

下面以Arrays为例说明。

package package1;

import static java.util.Arrays.*;
import  java.util.*;

import java.util.Arrays;

public class Testhh {
     public static void main(String[] args) {
         int[] arr = {3 , 1 , 5};
         sort(arr);
         int index = binarySearch(arr , 1);
         System.out.println(Arrays.toString(arr));  //不可省略Arrays,与Oeject的成员方法toString冲突
         System.out.println("index=" + index);
     }

}

运行结果:

[1, 3, 5]
index=0

【java】基础中的杂乱总结(一)的更多相关文章

  1. Java基础中的RMI介绍与使用

    今天在这边介绍一下Java基础中的rmi使用.其实rmi有什么样的使用场景呢?它跟webservice有什么区别呢?其实webservice主要是可以跨语言实现项目间的方法调用,而rmi只是java内 ...

  2. Java基础中的一些注意点

    1.在Java编程语言中,标识符是赋予变量.类或方法的名称.标识符可从一个字母.下划线(_)或美元符号($)开始,随后也可跟数字.标识符是大小写区别对待的并且未规定最大长度. 2.Java技术源程序采 ...

  3. 【java】基础中的杂乱总结(二)

    1 内部类进阶 package package8; //原则:先用内部类写 之后由于内部类匿名无法引用 用其继承的父类或实现的接口名 //再复写所有的抽象方法即可(是所有,否者还是抽象的,无法创建对象 ...

  4. Java基础中一些容易被忽视的语法小细节总结

    一:语法细节 1. Java中的命名规则: package:统一使用小写字母 class:首字母大写,使用驼峰标识 method:首字母小写,使用驼峰标识 field:首字母小写,使用驼峰标识 sta ...

  5. Java基础中字符串与字符的注意点!

    在Java中,字符的表达与字符串的表达是不一样的!话不多说,直接上代码!!! String  a="a"; char a='a'; 其中他们的引号是不一样的

  6. JAVA基础中的注意点(二)

    1.数组 a.特点:同种数据类型:数组类型一旦确定就不能改变. 连续空间存放:数据空间是连续的. 空间长度:数组有自己的长度,初始化的时候需要定义. 数组的下标:从0开始,第一个数组元素下标为0,最后 ...

  7. JAVA基础中的注意点

    1.标识符 标识符:标识某些事物用于区分的符号.  (即区分某些事物的符号) 四条硬性规定: a.不能是 关键字.true.false.null. b.可以包含 字母.数字.0-9.下划线(_)或美元 ...

  8. Java基础中的一些注意点(续)

    1.局部(local)变量是在一个方法内定义的变量, 也被称作自动(automatic).临时(temporary)或栈(stack)变量 -          当一个方法被执行时, 局部变量被创建: ...

  9. JAVA基础中的注意点(一)

    1.标识符 标识符:标识某些事物用于区分的符号.  (即区分某些事物的符号) 四条硬性规定: a.不能是 关键字.true.false.null. b.可以包含 字母.数字(0-9).下划线(_)或美 ...

随机推荐

  1. PAT 团体程序设计天梯赛-练习集 L1-016. 查验身份证

    一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...

  2. HDU3791二叉搜索树(二叉树)

    Problem Description 判断两序列是否为同一二叉搜索树序列   Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束.接下去一行是一 ...

  3. GROUP_CONCAT()多条数据.拼接字符串 最大长度1024

    mysql cmd show variables like "group_concat_max_len"; concat  合并多条数据 成一个逗号分隔的字符串 查找mysql的配 ...

  4. Storm中-Worker Executor Task的关系

    Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:1. Worker(进程)2. Executor(线程)3. Task 下图简要描述了这3者之间的关 ...

  5. 五指cms模版基础

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 利用POI获取Excel中图片和图片位置

    利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...

  7. CVE-2014-1767 漏洞分析(2015.1)

    CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...

  8. 判断pc浏览器和手机浏览器方法

    一 //平台.设备和操作系统        var system = {            win: false,            mac: false,            xll: f ...

  9. freemarker遍历list中的map

    前台: <select id="jq" name="jq" class="tsui" data-required="true ...

  10. Android中的Fragment页面切换和selector选择器

    效果如图: 提示:下面是用的整个的图片 下面看代码: //--------------------这是主页面布局文件----------------------- <?xml version=& ...