Java学习-第二天

03day 

   

  1.循环结构

  1).while语句  

while(条件表达式)
{
    执行语句;
}
//while语句判断条件符合则运行,直到判断条件不成立或遇到break 跳出循环

  2).do while 语句

do
{
    执行语句;
} while(条件表达式)
//do while 语句无条件运行一次后才开始判断条件是否满足。条件不满足则跳出循环

  3).for 语句

for(初始化表达式;循环条件表达式;循环后操作表达式)
{
    执行语句;
}
// for和while可以进行互换。如果需要定义循环增量,用for更为适合。

//无线循环表现形式

for(;;)
{

}

 while(1)
{

}

  4).for循环练习

class  D3PrintXing  //打印形状星型
{
    public static void main(String[] args) 
    {
        for(int i=6; i>0;i--){

            for(int j=i; j>0;j--){
                System.out.print("*");
            }
            System.out.println("");
        }    
    }
}

class D3ChengFaBiao  // 打印乘法表
{
    public static void main(String[] args) 
    {
        for(int i=1; i<10;i++){

            for(int j=i; j>0;j--){
                System.out.print(i + "*" + j + "=");
                if(i*j<10){
                    System.out.print("0"+i*j);
                }
                else{
                    System.out.print(i*j);
                }
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}

   2.break和continue

  break此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环。如果break语句包含在嵌套循环里,它只跳出最里面的循环。

  

  continue:程序运行到此语句时,不在执行循环体里continue后面的语句而是跳到下一个循环入口处执行下一个循环。如果continue语句包含在嵌套循环语句里,它只影响包含它的最里层的循环。

  

  3.函数

  函数就是定义在类中的具有特定功能的一段独立对的小程序。

  

函数的格式:
修饰符 返回类值类型 函数名(参数类型 形式参数1)
{
执行语句;
return 返回值;
}
返回值类型:就是函数运行后的结果的数据类型。
参数类型:就是形式参数的数据类型。
形式参数:就是一个变量,这个变量时用于存储调用函数时给函数传递实际参数用的。
实际参数:就是传递形式参数的具体数值。
return:用于结束函数。
返回值:该值会返回给调用者。

main函数就是一个典型的函数

static void main(String[] args)
{
    System.out.println("Hello World");
    return;
}

函数的重载 overload

在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或参数类型不同即可存在函数重载关系。

重载的特点:
函数重载与返回值类型无关,与参数列表有关。

4.数组
数组就是同一种数据类型的集合。
定义数组
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

int [] arr = new int[5];

元素类型 [] 数组名 = new 元素类型[]{元素1,元素2,...,元素n };

int [] arr = new int[] {21,31,43,52,12,312,431};

内存结构

Java程序正在运行时,需要在内存中分配空间。为了提高运算效率Java对内存空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

栈内存
用于存储局部变量,当数据使用完毕,该变量所占用的空间会自动释放。

堆内存
数组和对象,通过new的方式建立的实例都存放在堆内存中。每一个实例都有内存地址值,实例中的变量都有默认的初始化值,实例不再被使用,占用的空间不会立刻自动释放,而是在不确定的时间被Java垃圾回收器回收。

方法区

本地方法区

寄存器

04day

class D4ArraySort //选择排序
{
    public static void main(String[] args) 
    {
        int[] array = new int[] {43,656,754,887,112,2,41,512,1131,213,232,323,32,22,3,212,361};

        //排序前
        printArray(array);

        SelectSort(array,true);

        //排序后
        printArray(array);

        array = new int[] {43,656,754,887,112,2,41,512,1131,213,232,323,32,22,3,212,361};
        //排序前
        printArray(array);

        BubbleSort(array,true);

        //排序后
        printArray(array);
    }

    //选择排序
    /*
    每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
    */
    //Desc 排序是否从大到小,
    public static int[] SelectSort(int[] arr,Boolean Desc)
    {
        System.out.println("*******************  SelectSort  *********************");
            
        if(arr == null)
        {
            return arr;
        }

        if(Desc)
        {
            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);
                    }
                }
                System.out.print("i'="+i+" ");
                printArray(arr);
            }
        }
        else
        {
            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);
                    }
                }
            }
        }

        return arr;
    }

    //冒泡排序
    /*
    冒泡排序算法的运作如下:(从后往前)
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    针对所有的元素重复以上的步骤,除了最后一个。
    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    */
    public static int[] BubbleSort(int[] arr,Boolean Desc)
    {
        System.out.println("*******************  BubbleSort  *********************");
            
        if(arr == null)
        {
            return arr;
        }

        if(Desc)
        {
            for (int i=0;i<arr.length-1;i++ )
            {
                for (int j=0;j<arr.length-i-1 ;j++ )
                {
                    if(arr[j]<arr[j+1])
                    {
                        swap(arr,j,j+1);
                        
                    }
                }
                System.out.print("i'="+i+" ");
                printArray(arr);
            }
        }
        else
        {
            for (int i=0;i<arr.length-1 ;i++ )
            {
                for (int j=0;j<arr.length-i-1 ;j++ )
                {
                    if(arr[j]>arr[j+1])
                    {
                        swap(arr,j,j+1);
                    }
                }
            }
        }

        return arr;
    }

    public static void printArray(int[] arr)
    {
        for(int i=0;i<arr.length; i++)
        {
            if(i < arr.length-1 )
            {
                System.out.print(arr[i]+",");
            }
            else
            {
                System.out.print(arr[i]);
            }
        }
        System.out.println("");
    }

    //交换位置
    public static void swap(int [] arr ,int x, int y)
    {
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
}


class D4GetArrayIndex
{

    public static void main(String[] args)
    {
        int [] arr =new int[] { 1,3,4,6,8,12,15,16,35,67,69,70,92};
    
        int index = -1;

        index = halfSearch2(arr,16);
        System.out.println("index= "+index);
    
    }

    //二分查找
    public static int halfSearch(int[] arr,int key)
    {
        int min,mid,max;

        min = 0;
        max = arr.length-1;
        mid = (min+max)/2;

        while(arr[mid]!=key)
        {
            if(arr[mid]>key)
                max = mid -1;
            else if(arr[mid]<key)
                min = mid+1;

            if(min>max)
                return -1;

            mid=(min+max)/2;
        }
        return mid;
    }

    //二分查找
    public static int halfSearch2(int[] arr, int key)
    {
        int min = 0, max = arr.length-1, mid = 0;

        while(min <= max)
        {
            mid = (min+max) >> 1;

            if(arr[mid]<key)
                min = mid + 1;
            else if(arr[mid]>key)
                max = mid - 1;
            else
                return mid;
        }        
        return -1;
    }    

}

  05day

1.面向对象
面向对象是一种对现实世界理解和抽象的方法。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

2.现实世界与抽象世界
定义一个类就是在描述现实世界的事物过程中定义类的属性和行为。
1)类就是对现实世界中事物的描述。
2)对象就是这类事物,确确实实的存在个体
3)属性对应类中的就是变量
4)行为对应到类中就是函数

3.成员变量和局部变量的联系与区别
1)作用范围:
成员变量作用于整个类中。
局部变量作用于函数中,或者语句中。
2)在内存的位置:
成员变量:在堆内存中,因为对象的存在,才在内存中存在。
局部变量:存在于栈内存中。

4.匿名对象
匿名对象就是对象的简化形式。
匿名对象两种使用情况:
1).当对对象方法仅进行一次调用时
2).匿名对象可以作为实际参数进行传递

5.封装
封装就是指隐藏对象的属性和实现的细节,仅对外提供公共访问方式。
封装的原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。
封装的好处:
将变化隔离,便于使用,提高重用性,提高安全性。

class  Person
{
    private int age; //private :私有,权限修饰符,用于修饰类中成员。 私有只在本类中有效。
    //这里将age属性私有化就是为了封装age,只能通过setAge()方法修改本类中的age属性。
    
    void setAge(int age)
    {
        if(age>0 && age<150)
        {
            this.age = age;
        }
    }

    void speak()
    {
        System.out.println("age="+age);
    }    
}

class PersonDemo
{
        public static void main(String[] args) 
    {
        Person p = new Person();
        
        p.setAge(20);
        //p.setAge(-10) //年龄错误,
        p.speak();
    }
}

  

6.构造函数


构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
构造函数的特点:
1.函数名与类名相同。
2.不用定义返回会类型也没有return。
3.当类中没有定义构造函数,系统会默认给该类加入一个空参数的构造函数。

class  Person
{
    private int age; 
    private String name;

    //Person(){} 默认构造函数
    
    Person()
    {
        speak();
    }

    Person(String name,int age)
    {
        this.name = name;
        setAge(age);

        speak();
    }


    void setAge(int age)
    {
        if(age>0 && age<150)
        {
            this.age = age;
        }
    }

    void speak()
    {
        System.out.println("name = "+name+", age = "+age);
    }
    
}

class PersonDemo
{
        public static void main(String[] args) 
    {
        Person p = new Person();
        
        Person p1 = new Person("哈",30);

    }
}
/*
构造函数与一般函数的区别
在运行上,构造函数时在对象一建立就立即运行,用来给对象进行初始化
而一般方法是在对象调用才执行,是给对象添加对象具备的功能。

一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用任意次运行。

*/

7.构造代码块
作用:给对象进行初始化,
对象一建立就运行,而且优先于构造函数执行。构造代码块中定义的是不同对象共性的初始化内容。
与构造函数的区别:
构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象进行初始化。

class  Person
{
    private int age; 
    private String name;

    //Person(){} 默认构造函数
    


    Person()
    {
        speak();
    }

    Person(String name,int age)
    {
        this.name = name;
        setAge(age);

        speak();
    }


    void setAge(int age)
    {
        if(age>0 && age<150)
        {
            this.age = age;
        }
    }

    void speak()
    {
        System.out.println("name = "+name+", age = "+age);
    }

    {
        System.out.println("这个构造代码块,所有的对像建立都运行一次,而且优先于构造函数运行!");
    }
    
}

class PersonDemo
{
        public static void main(String[] args) 
    {
        Person p = new Person();
        
        Person p1 = new Person("哈",30);

    }
}

8.this 关键字
this主要是为了强调对象本身来说的.通俗一点说,就是this表示当前这个对象。

this的另外一个用法:用this调用构造函数

  

class Person
{
    private String name ;

    private int age ;

    public Person()
    {
        System.out.println("1. public Person()");
    }

    public Person(String name,int age)    
    {
        this() ;// 调用本类中无参构造方法

        this.name = name ; //this表示当前这个对象

        this.age = age ; //this表示当前这个对象

        System.out.println("2. public Person(String name,int age)");
    }
}

9.static 关键字
用法:是一个修饰符。用于修饰成员(成员变量和成员函数).
当成员变量被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。(类名.静态成员)

static的特点:
1.随着类的加载而加载,随着类的消失而消失,声明周期最长。
2.优先于对象存在
3.被所有对象共享
4.可以直接被类名调用

实例变量和类变量的区别
1.存放位置
类变量随着类的加载而存在于方法区中
实例变量随着对象的建立而存在于堆内存中
2.生命周期
类变量生命周期最长。
实例变量随着对象的消失而消失

静态使用的注意事项
1.静态方法只能访问静态成员
非惊天方法可以访问非静态和静态
2.静态方法中不可以使用this、super等关键字
因为静态优先于对象存在,所以静态方法中不可以出现this关键字

静态有利弊
利:对对象的共享数据进行单独空间的存储,节省空间。没有必要对个对象都存在一份。可以被类名直接调用
弊端:生命周期过长,访问出现局限性。

class  Person
{
    private int age; 
    private String name;
    private static String country = "the World";

    //Person(){} 默认构造函数   

    Person()
    {
        speak();
    }

    Person(String name,int age)
    {
        this.name = name;
        setAge(age);

        speak();
    }

    void setAge(int age)
    {
        if(age>0 && age<150)
        {
            this.age = age;
        }
    }

    void speak()
    {
        System.out.println("my name is"+name+", I'm "+age+".");         
    }

    {        
        this.country = "CN";         
    }

    static void sayHello()
    {
        System.out.println("Hi,i am from "+country);
        //System.out.println("my name is "+name+", I'm "+age+"."); //错误静态方法不能调用非静态成员            
    }    
}

class PersonDemo
{
        public static void main(String[] args) 
    {
        Person.sayHello(); //类名.静态方法(),因为静态代码块运行优先于代码块,所以国籍还是世界。
        
        Person p = new Person();
        p.sayHello();
        
        Person p1 = new Person("Li",30);

    }
}
/*

运行结果
F:JAVAcode>java PersonDemo
Hi,i am from the World
my name isnull, I'm 0.
Hi,i am from CN
my name isLi, I'm 30.

什么时候使用静态变量?
当对象中出现共享数据时,该数据使用静态修饰。
什么时候使用静态函数
当功能内部没有访问非静态数据,那么该功能可以定义为静态。

*/

10 主函数
public static void main(String[] args)
主函数:是一个特殊的函数,是作为程序的入口,可以被JVM调用。

主函数的意义:
public :代表着该函数的访问权的最大的。
static :代表着主函数随着类的加载就已经存在了。
void :代表着主函数没有返回值。
main: 不是关键字,但是是一个特殊的单词可以给JVM识别
(String[] args): 主函数的参数,参数是一个字符串数组。

jvm在调用主函数是,传入的是 new String[0];

11.私有化的构造函数可以防止类被实例化

public class A
{
private A(){};

}

class ADemo
{
A a = new A(); //编译失败
}

   12.生成说明文档的格式(公共类才能用)

  javadoc -d 生成目录 -author -version 类名.java

   eg. javadoc -d c:-author -version D1.java

  

13.静态代码块
格式:
static
{
//静态代码块中的执行预计
}
特点:随着类的加载而执行,且只执行一次,用于给类初始化。方法内不能调用非静态成员。

class  Person
{
    private int age; 
    private String name;
    private static String country = "the World";
    

    //Person(){} 默认构造函数

    //private Person(){} //私有化构造函数可以防止建立该类的对象

    Person()
    {
        speak();
    }

    Person(String name,int age)
    {
        this.name = name;
        setAge(age);

        speak();
    }


    void setAge(int age)
    {
        if(age>0 && age<150)
        {
            this.age = age;
        }
    }

    void speak()
    {
        System.out.println("my name is"+name+", I'm "+age+"."); 
    }

    static void sayHello()
    {
        System.out.println("Hi,i am from "+country);
        //speak(); //错误静态方法不能调用非静态成员            
    }

    {
        this.country = "CN";            
    }

    static
    {
        country = "CHINA";        //静态代码块优先于代码块执行    
        //speak(); /错误代码块不能调用非静态成员
    }
    
}

class PersonDemo
{
        public static void main(String[] args) 
    {
        Person.sayHello(); //类名.静态方法(),因为优先于代码块,所以国籍是"CHINA"。
        
        Person p = new Person();
        p.sayHello();
        
        Person p1 = new Person("Li",30);

    }
}
/*
运行结果
F:JAVAcode>java PersonDemo
Hi,i am from CHINA
my name isnull, I'm 0.
Hi,i am from CN
my name isLi, I'm 30.
*/

14.单例模式

步骤:
1.将构造函数私有化
2.在类中创建一个本类对象
3.提供一个方法可以获取到该对象

/*饿汉试 建议使用 */
class D6Single
{
    private D6Single() {};
    
    private static D6Single s = new D6Single();

    public static D6Single getInstance()
    {
       return s;
    }

    private int num =0;

    public int getNum()
    {
        return num;
    }
    
    public void setNum(int num)
    {
        this.num = num;    
    }
}

class D6SingleDemo
{

    public static void main(String[] args) 
    {
        D6Single s =  D6Single.getInstance();
        s.setNum(2000);
    
        D6Single s1 = D6Single.getInstance();    
        System.out.println(s1.getNum());
    }

}

/*懒汉试 低效 */
class D6Single2
{
    private static D6Single2 single2 = null;

    private D6Single2(){ };
    
    //同步
    public static  D6Single2 getInstance2()
    {
        if (single2 == null)
        {   //双重判断
            synchronized(D6Single2.class)
            {
                if (single2 == null)
                    single2 = new D6Single2();
            }
        }
        return  single2;
    }

    private int num =0;

    public int getNum()
    {
        return num;
    }
    
    public void setNum(int num)
    {
        this.num = num;    
    }
}

class D6SingleDemo2
{
    public static void main(String[] args) 
    {
        D6Single2 s1 =  D6Single2.getInstance2();
        s1.setNum(2000);
    
        D6Single2 s2 = D6Single2.getInstance2();    
        System.out.println(s2.getNum());
    }
}
原文地址:https://www.cnblogs.com/lhy_2011/p/4020221.html