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. html5权威指南:表格元素

    第十一章:表格元素                                                                                           ...

  2. input、button、a标签 等定义的按钮尺寸的兼容性问题

    在项目中有遇到这类问题,搜索了一下解决方式,采用链接:https://segmentfault.com/q/1010000000190931 里各位楼主的答案,摘抄如下: 例子如下: HTML: &l ...

  3. 在一个页面重复使用一个js函数的方法

    给每个拥有相同行为的问题DOM节点一个相同的class类,如question,同时给不同的问题一个不同的标识ID如 id="question1" id="question ...

  4. 彻底解决tap“点透”,提升移动端点击响应速度

    申明!!!最后发现判断有误,各位读读就好,正在研究中.....尼玛水太深了 前言 近期使用tap事件为老夫带来了这样那样的问题,其中一个问题是解决了点透还需要将原来一个个click变为tap,这样的话 ...

  5. arttemplate函数摘录

    对artTemplate函数摘录,希望可以用到自己平时的工作中去 var toString = function (value, type) { if (typeof value !== 'strin ...

  6. [SQL基础教程]1-4 SQL 表的创建

    [SQL基础教程]1-4 SQL 表的创建 创建数据库 语法 CREATE DATABASE <数据库名称> // example CREATE DATABASE shop; 创建表 语法 ...

  7. 11.hibernate的连接查询

    1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding=" ...

  8. android.telephony.SmsManager 短信笔记

    android 几种发送短信的方法 http://www.oschina.net/question/163910_27409 <uses-permission android:name=&quo ...

  9. [Mark] openvswitch megaflow

    Megaflow is an OpenVSwitch (OVS) feature than enables us to install flows for which some fields are ...

  10. js iframe跨域访问

    1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...