• 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());
        }
    }
  • 相关阅读:
    Rocketmq
    HTTPS 证书显示不安全
    js json 转为url参数
    Telnet 安装
    自己配置环境变量不起作用的问题
    Android笔记-Dalvik VM-1
    Fuzzy Logic/Expert System/Control
    PhD第一学期小结
    linux中的>、>>、2>&1、管道命令
    Hyper-v虚拟机设置静态IP
  • 原文地址:https://www.cnblogs.com/lhy_2011/p/4020221.html
Copyright © 2020-2023  润新知