首页 > 代码库 > Java学习-第二天
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:\JAVA\code>java PersonDemoHi,i am from the Worldmy name isnull, I‘m 0.Hi,i am from CNmy 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:\JAVA\code>java PersonDemoHi,i am from CHINAmy name isnull, I‘m 0.Hi,i am from CNmy 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()); }}
Java学习-第二天