return-----返回具体的结果(结束方法);很少单独使用,用在具有具体返回值类型的方法中.
return 结果值;
方法就是表示特定功能的一段代码,使用功能代码块{}将核心内容包起来,并为其起一个名字(符合标识符命名)即可.
定义格式:固定格式
权限修饰符 static 返回值类型 方法名(形式参数类型1 变量1,形式参数类型2 变量2...){ 功能代码 return 结果; }
public static 返回值类型 方法名(形式参数类型1 变量1,形式参数类型2 变量2....){ 功能代码 return 结果; }
权限修饰符:现在使用的public为公开的,权限足够大的,后期还会学别的;
static:面向对象在学习,目前阶段必须加上static;
返回值类型:数据类型;
方法名:需要见名知意,符合标识符命名规范;
形式参数类型:数据类型;
变量名:需符合标识符命名规范.
有返回值类型的方法调用:
1)单独调用 add(a,b) ; 没有输出结果 2)输出调用:可以用,不建议用,因为如果需要将结果进一步操作,写死,不太好! System.out.println("两个数据之和是:"+add(a,b)) ; 3)赋值调用:推荐 int result = add(a,b) ; System.out.println("两个数据之和是:"+result); 语法:返回值类型 变量名 = 方法名(实际参数1,实际参数2...);
(1)明确返回值类型 (2)明确参数类型以及参数个数
定义格式:固定格式
权限修饰符 静态修饰符static void 方法名(形式参数类型1 变量1,形式参数类型2 变量2...){ 输出语句/数据交换 } 注意:用void代替了返回值类型
无返回值方法的调用:
1)单独调用:推荐 方法名(实际参数列表) ; 2)输出调用:不行 3)赋值调用:不行
<1>方法和方法是平级关系,在一个方法中不能嵌套定义另一个方法
<2>Java为强类型语言,定义方法的时候,形式参数类型必须携带,不能省略
<3>调用方法的时候,实际参数不需要携带数据类型
<4>定义方法的时候,有{左大括号的地方不能有分号;
有;号的地方不能有{左大括号,会显示这个方法缺少方法主体,没有意义.
一个类中可以定义多个相同名称的方法,多个方法名称相同,参数列表不同,与返回值无关.
1)参数个数不同 2)参数类型不同 3)考虑类型顺序
方法重载的目的:就是为了让这个功能扩展性更多.
一组连续的存储空间,存储多个相同数据类型的值.
数据类型[] 数组名称; eg: int[] arr ; 定义了一个int类型的数组变量arr
数据类型 数组名称[]; eg: int arr[] ; 定义了一个int类型的arr数组变量
动态初始化:我们给定数组的长度,元素由系统(Jvm)默认初始化;
数据类型[] 数组名称 = new 数据类型[长度] ; 推荐第一种 eg: int[] arr = new int[3] ; 数据类型 数组名称[] = new 数据类型[长度] ; eg: int arr[] = new int[3] ;
静态初始化:静态初始化是指给出具体的长度内容,系统默认分配长度.
格式
数据类型[] 数组名称 = new int[]{元素1,元素2,元素3,.....} ; 推荐使用 数据类型 数组名称[] = new int[]{元素1,元素2,元素3,.....} ; 简化格式:书写代码简单(注意此格式不能换行) 数据类型[] 数组名称 = {元素1,元素2,元素3,.....} ; 数据类型 数组名称[] = {元素1,元素2,元素3,.....} ;
注意:要么动态初始化,要么静态初始化,不能动态和静态一起使用.
数组名称[索引值];索引值从0开始 arr[0];//访问数组第一个元素
int[] arr = new int[3] ;//jvm系统默认对3个初始化 解析格式: =左边: int:数组中存储的int数据类型 []:数组:一维数组(默认) arr:变量名(数组的在内存中的对象名称) =右边: new:表示创建对象 int:表示存储的数据int类型 [3]:数组中存储的3个元素:(长度) System.out.println(arr) ; //[I@6d06d69c :地址值 [:表示一维数组 I:int数据类型 @:地址值标记 6d...:十六进制数据
jvm检查语法不通过; 语法格式存在问题(例如数组和变量格式写错,变量被定义多次等)
开发者代码书写不严谨出现的问题
eg1:java.lang.ArrayIndexOutOfBoundsException:数组角标越界异常
出现的原因:访问了数组中不存在的角标(索引值)
如何解决:检查代码,更改索引值
eg2:java.lang.NullPointerException:空指针异常
引用类型的默认值都是null;
String s = null ; 字符串是一种特殊的引用类型
出现的原因:某一个对象已经为空了,null(没有堆内存地址),这个时候还要去访问元素或者调用
这个对象的方法,那么就出现空指针;
如何解决:
使用逻辑判断语句,对该对象进行非空判断
(1)基本数据类型做形式参数特点:基本类型作为形式参数传递特点:形式参数的改变不会影响实际参数.当方法结束后,就消失了(临时变量-----形式参数);
(2)引用数据类型做形式参数特点:形式参数的改变,会直接影响实际参数.是空间地址值的传递,当方法结束了,对象不会被立即回收,等待垃圾回收器回收(GC).
注意:String为特殊引用类型,他的效果和基本数据类型相同.
class Demo{ public static void main(String[] args){ int a = 10 ; int b = 20 ; System.out.println("a:"+a+",b:"+b) ; //10,20 change(a,b) ; System.out.println("a:"+a+",b:"+b) ; //10,20 System.out.println("--------------------------") ; int[] arr = {1,2,3,4,5} ; System.out.println(arr[1]) ; //2 System.out.println("--------------------------") ; change(arr) ; System.out.println(arr[1]) ;//4 } public static void change(int a,int b){ a = b ; b = a+b ; System.out.println("a:"+a+",b:"+b) ; //20,30 } public static void change(int[] arr){ for(int x = 0 ; x < arr.length;x++){ if(arr[x] % 2== 0){ arr[x] = arr[x]*2 ; } } } }
(1)冒泡排序思想:两两比较,将较大的值往后放,第一轮比较完毕后,最大值出现在最大索引处,依次进行第2轮,第3轮比较...就可得到最终结果.每一次比较,下一次就会减少一次,比较次数是数组长度-1次;
for(int i = 0;i < arr.length - 1;i++){ for(int j = 0;j < arr.length -1 - i;j++){ 元素互换 if(arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
(1)更符合我们生活中思想行为习惯
(2)让更复杂事情简单化
(3)角色发生变化,从执行者变为指挥者
<经典面试题>:什么是面向对象:阐述面向对象思想特点加生活中例子.
java语言面向对象的三大特征:封装,继承,多态
(1)类的定义:能够描述一组事物的属性和行为的集合. 能够描述现实中真实存在的事物.
java中最基本的单元: 类-----------------事物
成员变量---------描述事物的属性
成员方法----------描述事物的行为(非静态的)
(2)成员变量------------在类中,方法外
成员方法-------------之前怎么定义,现在还怎么写,不过去掉static关键字
public 返回值类型 方法名(形式参数列表){ 功能代码块 return 具体的结果; }
public void 方法名(形式参数列表){ 输出打印 }
<注意>定义方法时的两个明确
类:能够描述一组事物的属性和行为的集合;类-----描述现实世界真实存在"事物"
对象:描述具体的事物,事物为泛指,描述具体的事物,通过代码创建当前类的对象.
<注意>类是一个泛指,对象才是当前事物的具体体现.
<代码体现>
类名 对象名 = new 类名(); //给具体事物属性赋值 对象名.成员变量 = 根据类型赋值; //调用具体事物的行为 对象名.成员方法名();
局部变量:在方法定义中或者是方法声明上.
成员变量:在类的内部,方法的外部.
局部变量:在栈内存中
成员变量:在堆内存中
局部变量:随着方法调用而存在,随着方法调用结束而消失
成员变量:随着对象的创建而存在,随着对象的调用完毕,不会立即消失,等待垃圾回收器空闲的时候回收.
局部变量:可以先定义,使用之前必须初始化;要么直接初始化.
成员变量:可以不赋值,系统默认对成员变量初始化;
也可以通过对象名.成员变量 = 值 完成赋值.
如果一个方法的形式参数是一个类,实际参数需要传递的当前类的具体对象
class Student{ public void study(){ System.out.println("爱学习,爱生活!") ; } } class StudentDemo{ public void method(Student s){//Student student = new Student() ; s.study() ; //student.study(); } } class StudentTest{ public static void main(String[] args){ //需求: //1)要访问StudentDemo类中的method方法 //2)调用的时候,实际参数如何书写呢? StudentDemo sd = new StudentDemo() ; Student student = new Student() ; Student student = new Student() ; sd.method(student); } }
匿名对象:名义名字的对象.
<1>定义: new 类名() ; eg: new Student();
<2>访问: 访问类的成员变量 new 类名().成员变量名;
访问类的成员方法:没有具体返回值类型: new 类名().成员方法名() ;
<1>匿名对象可以作为对象传递
<2>节省内存空间
<3>开发中,匿名对象一般 使用"一次即可",使用完毕就立即被垃圾回收器回收
<4>大多用在手机端,节省内存空间
(1)封装关键字private:私有的,不能直接访问的;
(2)封装的概念:为了保证类属性的安全性,所有的属性都必须加入private关键字,并且对外提供公共访问方法间接对成员变量(属性)进行赋值;setXXX()/getXXX():都是public:权限足够大.
(3)封装的特点:被private修饰的成员变量或者是成员方法,只能在本类中访问;
外界类是不能直接访问的,间接可以通过公共的成员方法访问!
当局部变量名称和成员变量名称一致时(局部变量隐藏了成员变量),Java提供了一个关键字:this;
this:代表当前类对象的地址值引用.
构造方法:构造方法是一种特殊的方法,名字和类名完全相同.
<1>方法名和类名完全一样
<2>构造方法没有返回值类型
<3>构造方法连void都没有
注意:构造方法支持方法重载.
构造方法就是对类中的成员属性进行初始化.
<1>无参构造方法: public Student(){}; <2>有参构造方法: public Student(String name,int age){};
<1>当开发者没有提供无参构造方法,也没有提供有参构造方法,系统永远给我们提供无参构造方法;
<2>如果我们提供了有参构造方法,系统将不会默认提供无参构造方法.
setxxx(xxx);
public 类名(形式参数){ this.name = name; this.age = age; }
(1)成员变量: 私有化 private
(2)构造方法: 无参/有参 构造方法
(3)成员方法: setxxx(xxx); getxxx(xxx); 其他方法