【java】基础中的杂乱总结(一)
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 内部类相关
/*
* 内部类的访问规则:
* 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】基础中的杂乱总结(一)的更多相关文章
- Java基础中的RMI介绍与使用
今天在这边介绍一下Java基础中的rmi使用.其实rmi有什么样的使用场景呢?它跟webservice有什么区别呢?其实webservice主要是可以跨语言实现项目间的方法调用,而rmi只是java内 ...
- Java基础中的一些注意点
1.在Java编程语言中,标识符是赋予变量.类或方法的名称.标识符可从一个字母.下划线(_)或美元符号($)开始,随后也可跟数字.标识符是大小写区别对待的并且未规定最大长度. 2.Java技术源程序采 ...
- 【java】基础中的杂乱总结(二)
1 内部类进阶 package package8; //原则:先用内部类写 之后由于内部类匿名无法引用 用其继承的父类或实现的接口名 //再复写所有的抽象方法即可(是所有,否者还是抽象的,无法创建对象 ...
- Java基础中一些容易被忽视的语法小细节总结
一:语法细节 1. Java中的命名规则: package:统一使用小写字母 class:首字母大写,使用驼峰标识 method:首字母小写,使用驼峰标识 field:首字母小写,使用驼峰标识 sta ...
- Java基础中字符串与字符的注意点!
在Java中,字符的表达与字符串的表达是不一样的!话不多说,直接上代码!!! String a="a"; char a='a'; 其中他们的引号是不一样的
- JAVA基础中的注意点(二)
1.数组 a.特点:同种数据类型:数组类型一旦确定就不能改变. 连续空间存放:数据空间是连续的. 空间长度:数组有自己的长度,初始化的时候需要定义. 数组的下标:从0开始,第一个数组元素下标为0,最后 ...
- JAVA基础中的注意点
1.标识符 标识符:标识某些事物用于区分的符号. (即区分某些事物的符号) 四条硬性规定: a.不能是 关键字.true.false.null. b.可以包含 字母.数字.0-9.下划线(_)或美元 ...
- Java基础中的一些注意点(续)
1.局部(local)变量是在一个方法内定义的变量, 也被称作自动(automatic).临时(temporary)或栈(stack)变量 - 当一个方法被执行时, 局部变量被创建: ...
- JAVA基础中的注意点(一)
1.标识符 标识符:标识某些事物用于区分的符号. (即区分某些事物的符号) 四条硬性规定: a.不能是 关键字.true.false.null. b.可以包含 字母.数字(0-9).下划线(_)或美 ...
随机推荐
- EasyuiAPI:基础
一.EasyLoader(简单加载) locale属性:值类型是string locales属性:值类型是object 二.Draggable(拖动) 1.通过标签创建: <div id=&qu ...
- ORACLE 11g dblink 配置升级
1.如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限: select * from user_sys_privs where privilege like upper('% ...
- 安卓访问webAPI,并取回数据
前言 安卓自从4.0以后,所有的网络访问都需要异步进程操作.其自带的异步类有AsyncTask,Handler,以及可以声明Thread等等.涉及到多进程,必须要提到一个问题,线程与线程之间不能直接进 ...
- mysql 登录中用户管理
管理员账号 root 新增普通用户 修改root密码
- [SOJ] 图的广度优先搜索
Time Limit: 1sec Memory Limit:256MB Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上 ...
- 练习3:修改withdraw 方法
练习目标-使用有返回值的方法:在本练习里,将修改withdraw方法以返回一个布尔值来指示交易是否成功. 任务 1.修改Account类 a.修改deposit 方法返回true(意味所有存款是成功的 ...
- 转载-ACPI的知识
ACPI – the Advanced Configuration & Power Interface. ACPI是OS,BIOS和硬件之间的抽象层.它允许OS和平台独立的发展,比如新的OS可 ...
- iOS https plist
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key ...
- linux zeromq
本人在centos下安装zeromq 1.下载最新版的zeromq http://download.zeromq.org/ 2 解压 tar -xvf zeromq-3.1.0-beta.tar.gz ...
- python&MongoDB
1 #!/usr/bin/python 2 #-*- coding:utf-8 3 import pymongo 4 connection=pymongo.MongoClient() 5 tdb=co ...