JAVA第三周学习总结
if…else…和三元运算符的区别
共同点:两种情况进行判断,成立对应的内容,不成立,执行不成立的内容;
区别:
三元运算符是操作符号,属于运算符,一般都是具体的数据值,而它里面不能使用输出语句;
它相对if…else…来说,范围很小;
而if…else…是流程控制语句,它不仅仅是操作数据值(尽量去赋值),而且可以打印内容
System.out.println(“xxx”) ;范围大;
开发中优先采用流程语句去完成逻辑判断
三元运算符能够实现,一定可以使用if…else…
if…else…能够实现的,不一定能使用三元运算符
for循环和while循环的区别
1)格式不同
for(初始化语句;条件表达式;控制体语句){
循环体语句;
}
初始化语句;
while(条件表达式){
循环体语句;
控制体语句;
}
2)是否明确循环次数
若明确循环次数,使用for循环(工程使用居多for)
不明确循环次数,使用while循环
3)从内存角度考虑,是否节省内存空间
for循环优于while循环的这种格式;因为for结束,里面使用的变量即使从内存中释放,节省内存资源消耗;
while循环,使用完成之后,直接还可以去使用这个变量;
什么是水仙花数?for循环获取所有水仙花数
水仙花是三位数: 明确范围, 每个位立方相加的结果就是当前数据本身!
class Demo{
public static void main(String[] args){
System.out.println("水仙花数是:") ;
//水仙花数,明确范围
for(int x = 100 ;x <= 999; x++){
//定义三个变量,个位,十位,百位
int ge = x % 10 ;
int shi = x /10 %10;
int bai = x /10 /10 %10 ;
//满足条件
if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
System.out.println(x) ;
}
}
}
}
switch语句
switch语句
case语句后面只能是常量,不能是变量
default语句可以在语句中的任何位置,不影响执行流程
如果在语句的末尾,break可以省略;
但是在语句中,break不要省略
switch语句的结束条件:
1)遇见break语句结束;
2)程序默认执行到末尾
switch后面的变量的数据类型:byte,short,int,char
jdk5以后可以是枚举 enum 枚举名{}
jdk7以后可以是String
传统自定定义常量
public static final 数据类型 变量名 = 值;
Java中的方法定义以及调用(重点)
定义格式
Java中定义的方法格式有两种定义格式
固定格式:
方式1:有返回值类型的方法定义(在需求中需要根据实际场景需要返回值类型:数据类型)
权限修饰符 static 返回值类型 方法名(参数类型1 参数名称1,参数类型2 参数名称2…){
//完成的方法逻辑操作
return 结果;
}
解释:
权限修饰符 :目前 public 公共,公开的,访问权限足够大
static: 面向对象中的静态
返回值类型:现在数据类型
方法名:满足标识符的规则–>方法名需要满足"小驼峰命名法")
参数类型:就是数据类型
参数名称:就是形式参数(变量名)
return:关键字 :这个方法结束,带回结果,谁调用,给谁!
没有具体返回值类型的方法定义
前面固定写法
正常的格式:
public static 返回值类型 方法名(形式参数类型1 参数名1,…){
里面直接完成了输出操作或者一些其他逻辑,
没有return关键字
System.out.println(“xxxx”) ;
}
方法重载 OverLoad(重点)
overload方法重载
多个方法的方法名可以相同,参数列表不同,与返回值无关!
参数列表不同:可以有下面几种
1) 参数类型不同
2)参数个数不同
3)考虑参数的先后顺序不同
Java中有一个规定:
标识符里面规则: 给方法起名,见名知意!
为了标记同一种方法里面可以完成不同参数的使用,为了提高代码的扩展!
java提供overload方法重载
跳转控制语句 break,continue,return分别是什么
break:在循环语句以及switch中使用,结束,中断的意思,不能单独使用如果在while(true)中使用的switch进行选择判断,里面的break只是结束switch语句的,这种情况也可以使用
System.exit(0) ;可以终止jvm,while(true)也就结束了;
continue:仅仅结束当前循环立即进入下一次循环;不能单独使用,也是在循环中使用的
return: 都是用在有具体返回值类型方法中的,可以单独用(但是很少)
结束方法去用的;结束方法之前,需要带回返回结果,将结果返回调用者!
Jvm内存分配:栈,堆,方法区,本地方法区(和系统相关),寄存器(和系统相关)栈内存:
存储局部变量(在方法定义中或者方法声明上),局部变量跟方法有关的;方法进栈,方法调用完毕,里面局部变量随着调用结束而消失
堆内存:
new出来的东西(引用数据类型)存储在堆中,而且它是随着对象的创建完毕,产生堆内存空间地址值!
方法区:
里面很多的区域:class字节码文件区域—存储字节码文件—jvm需要加载这个类,解析这个类所有的方法以及变量(—这个过程"反射技术")
static区域:----静态区域–存储跟static相关的一些方法以及变量等等
constant pooll:常量池 里面存储常量相关的
本地方法区(了解): 和系统相关的----->创建系统资源完成系统相关的操作
寄存器(了解): 和系统cpu都有关系:电脑的核数(16核/8核的)–核数越大,高并发场景下,运行效率越高;
Java中数组的概念
数组是一个容器,这个容器能够存储同一种类型的多个元素!
-
如何定义数组
Java规定有一种固定的格式数据类型[] 数组名称 ; 数据类型 数组名称[] ; //举例:int[] arr; 定义一个int类型对数组arr变量 int arr[] ; 定义一个int类型arr数组 创建数组---->对数组进行初始化(创建数组对象)----两种方式 1)动态初始化 2)静态初始化
-
创建一个对象内存图解
-
创建两个对象内存图解
-
创建多个对象内存图解 :不同的栈指向同一个堆
-
静态初始化
指定数组的元素,长度由系统给定
**本身的格式
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3…}; 推荐这个
或者
数据类型 数组名称[] = new 数据类型[]{元素1,元素2,元素3…};简写格式 数据类型[] 数组名称 = {元素1,元素2,元素3...}; 或者 数据类型 数组名称[] = {元素1,元素2,元素3...}; 举例 int[] arr = new int[]{1,2,3} ;---->int[] arr = {1,2,3} ; int arr2[] = new int[]{11,22,33} ;--->int arr2[] = {11,22,33} ;**
使用静态初始化
不能动静结合!
int[] arr = new int[3]{1,2,3} ; 错误的
异常
jdk提供了类 java.lang.Throwable–>Exception/error
Exception类
子类 RuntimeException:运行时期异常 (程序在运行时发生的问题—>代码写的逻辑不严谨或者一些漏洞)
不是RuntimeException里面的类:都是编译时期异常(在idea或者eclipse开发工具中,编译通过不了,语法错误!)
error:严重问题(错误) —内存溢出
以后见到异常---->总结出来一套东西
总结:什么原因导致的这个异常?
这个异常的解决方案?
数组里面或者以后学到String类都会出现一种==“角标越界”==
String–字符串 “helloworld” —底层就是’h’,‘e’,‘l’,‘l’…这些字符组成的(char[])
java.lang.ArrayIndexOutOfBoundsException:数组角标越界异常(属于运行时期异常!)
出现的原因:访问了数组中不存在的索引值
解决方案:检查代码,控制索引值!
java.lang.NullPointerException:空指针异常 (伴随你的整个JAVA生涯)
出现的原因:程序员在书写代码的时候,由于调用各种格样第三方提供这些功能,
可能获取到某个对象为空值,然后还是用空对象去访问元素或者调用功能,都会出现这个问题!
解决方案:最直接的方案:就是非空判断一下
数组高级排序
冒泡排序的思想:
两两比较,将较大的值往后放,第一次比较完毕,最大值就出现在最大索引处
依次这样比较,可以得到一个排好序的数组;
规律:
1)两两比较,较大的值往后放
2)第一次有0个不比,
第二次有1个不比
第三次有2个不比
…
比较的次数:数组长度-1次
*public static void bubbleSort(int[] arr){
-
for(int x = 0 ; x < arr.length-1;x++){//控制比较的次数 // arr.length-1-x:为了减少比较的次数 for(int y = 0 ; y < arr.length-1-x; y++){ //如果前面的元素比后面元素大 if(arr[y]> arr[y+1]){ int temp = arr[y] ; arr[y] = arr[y+1] ; arr[y+1] = temp; } }*
遍历数组方法
*public static void printArray(int[] arr){
-
System.out.print("["); //遍历数组 for(int x = 0 ; x < arr.length ; x++){ //判断:如果是最大索引值,取到最后一个元素 if(x== arr.length-1){ System.out.println(arr[x]+"]"); }else{ //中间的元素 System.out.print(arr[x]+", "); } }
面向对象(重点)
面向对象的思想特点是什么? 面向对象和面向过程什么区别?(理论)
面向对象的思想特点:
1)更符合现实生活中的思想行为习惯
2)让复杂的事情简单化
3)角色发生了改变:从执行者(面向过程)—>变成指挥者(面向对象)
面向对象相比于面向过程步骤更为简便;
面向对象设计理念以及面向对象的三大特征(记忆)
面向对象的设计理念:
不断的创建对象,使用对象,指挥对象做事情!(面对对象的宗旨)
一直用的Scanner:键盘录入
Scanner sc = new Scanner(System.in) ;
//sc.nextInt() ; sc.nextLine();
sc.nextBoolean();
面向对象的三大特征:封装,继承,多态(面向对象重点)
什么是类(Java中) ----->就是现实世界中的真实存在多事物
类:是Java语言中最基本的单元;能够描述现实世界事物的一组事物的属性和行为的集合!
类和现实世界事物是一一对应的关系;
什么是对象?
对象:描述现实世界的具体事物!(具体事物的具体的属性和行为)
类名 对象名 = new 类名() ;
对象名.成员变量名 = 值 (根据成员变量的类型赋值); 访问成员变量 赋值
对象名.方法名(); 访问我们自己的定义的成员方法,去使用它,展示数据或者实现具体业务需求
局部变量与成员变量的区别
局部变量和成员变量有什么区别?
1)书写位置的区别
局部变量:在方法定义中或者方法声明上的变量
成员变量:类中方法外!
实际开发中:根据具体的情况具体使用,范围越小越好,因为范围小,使用完,释放内存了!
2)内存位置不同
局部变量:在栈内存中—跟方法有关(方法进栈)
成员变量:在堆内存中—跟对象有关 (类名 对象名 = new 类名();
3)生命周期不同:
局部变量:随着方法调用而存在,随着方法调用结束而消失
成员变量:随着对象的创建而存在,随着对象的创建完毕后,使用完毕(访问成员变量/访问成员方法)之后等待
垃圾回收器空闲时候回收而消失!(不会立即释放)
4)初始化值不同
局部变量:在使用之前必须初始化,否则报错
成员变量:跟对象有关系,存在系统默认初始化,然后可以显示初始化 对象名.成员变量名=赋值;
形式参数: 基本数据类型和引用类型 —调用该方法,实际参数
1.基本数据类型分为四类八种:
整数类型:long、int、short、byte;
浮点类型:float、double:
字符类型:char
布尔类型:boolean
2.引用数据类型非常多,大致包括:
类、接口、数组、枚举、注解、字符串等…
String类型就是引用类型
基本数据类型与引用类型的区别
基本变量类型:
在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的。
在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的
默认值:0
2.引用类型变量:
只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址。
引用数据类型变量,调用方法时作为参数是按引用传递的,传递的是引用的副本
默认值:null
匿名对象(没有名字的对象) (重点)
匿名就是没有名字的对象,在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储
java代码 体现
类名 对象名 = new 类名() ;
new 类名().成员变量=赋值;
new 类名().成员方法 ;
关于封装的概念 (重点)
private :私有的 ,修饰的成员变量或者成员方法只能本类中访问 (为了保证数据安全)
this关键字 (重点)
this的含义: 代表当前类对象的地址值引用
加入this---->标准类的写法 (描述学生事物/描述手机事物)
JavaBean规范:
1)类是具体类 class 类名{}
2)类的属性必须私有化
3)类中必须提供setXXX()/getXXX() 对成员变量的公共的访问方法(赋值/获取值)