Java学习的第二周

Java学习的第二周

1.数组

        //数组的动态初始化
		int[] arr = new int[3] ;  //堆内存空间地址
		int[] arr2 = new int[2] ;//堆内存空间地址

		// 打印数组名,输出的是数组的地址值
		System.out.println(arr) ; //[I@6d06d69c      
		System.out.println(arr2) ;//[I@7852922

		//定义第三个数组对象
		int[] arr3 = arr ; //将一个对象赋值给另一个对象--->将地址值赋值给第三个数组
		arr3[0] = 20 ;     // arr[0]的值发生改变
		arr3[1] = 70 ;	   // arr[1]的值发生改变
		System.out.println(arr[0]) ;  // 20
		System.out.println(arr[1]) ;  // 70

注意:

int[] arr = new int[2]{10,20} ; 错误的,动态初始化和静态初始化不能一起使用

2.数组中常见的异常

	数组中会遇见的一些异常:
	异常:Throwable 类
	异常分为两大类:
			Error:程序出现了严重的问题;
			Exception:
				RuntimeException:运行时期异常 
					java.lang.ArrayIndexOutOfBoundsException属于运行时期异常的一种
					java.lang.NullPointerException属于运行时期异常的一种
						
				编译时期异常(只要不是RuntimeException的异常都属于编译时期)
		
	
		java.lang.ArrayIndexOutOfBoundsException:属于运行时期异常的一种
						数组角标越界异常
								出现的原因:访问了数组中不存在的角标值
								解决方案:更改角标在范围内即可!
								
								
		java.lang.NullPointerException:空指针异常(引用类型中经常会出现的异常!)
		出现的原因:
				代码结构不严谨(某个对象已经为null,还有使用这个对象调用方法或者访问元素...)
		解决方案:
				只要 给对该对象进行非空判断
				如果该对象不为空,才能使用这个对象完成一些操作!

举例:

class ArrayDemo4{
	public static void main(String[] args){
		
		//定义一个数组,静态初始化
		int[] arr = {1,2,3} ; //new int[]{1,2,3} ;
		
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		//该数组最大的角标值是2
		//System.out.println(arr[3]);  //java.lang.ArrayIndexOutOfBoundsException  :数组角标越界
		
		//Javac  ArrayDemo4.java -----> 编译的时候,检查这类中所有的Java语法
		
		
		//引用类型的默认值是null
		//arr = null ;
		//System.out.println(arr[0]) ; //java.lang.NullPointerException:空指针异常
		
		arr = null ;
		//加入一个逻辑判断:非空判断
		if(arr!=null){
			System.out.println(arr[0]) ;
		}else{
			System.out.println("该对象为空了,不能再使用这个对象了") ;
		}
	}
}

数组的遍历:

**数组中:提供了一个属性:length属性:获取数组中的长度
//最大的角标值=数组的长度-1 = 数组名称.length -1 ;

for(int x = 0 ; x < arr.length ; x ++){
	System.out.print(arr[x]+" ") ;
}                                      

重点:

数组中有没有length属性,字符串中有没有length属性,集合中有没有length属性

	数组中:存在length属性
	字符串没有length属性------->String类中:length()
	集合中没有length属性------->集合中:size()

3.冒泡排序

思想:

冒泡排序的思想:
	
		两两比较,将较大的值往后放,第一次比较完毕,最大值出现在
最大索引处,依次这样比较...
		规律:
				两两比较,将较大的值往后放
				总共比较的次数:数组长度-1

伪代码:

	public static void bubbleSort(int[] arr){
		for(int x = 0 ; 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 ;   
				}
			}
		}
	}

4.二维数组

定义:

二维数组:
			其实就是一个元素为一维数组的数组
			
	定义格式:
	数据类型[] 数组名称[] ;
	数据类型[][] 数组名称 ;
	
	动态初始化:
		格式1:
			数据类型[][] 数组名称 = new 数据类型[m][n] ;
		举例:
			 int[][] arr = new int[3][2] ;
		=号左边:
			int:当前数组存储的是int类型的元素
			[][]:定义的是一个二维数组
			arr :数组对象名称
		=号右边:
			new :在堆内存中创建该数组的对象(产生堆内存空间地址)
			int:当前数组存储的是int类型的元素
			[3]:当前定义的这个二维数组中有3个一维数组
			[2]:每一个一维数组中有2个长度

注意事项:

在一些笔试题:定义变量 进行初始化
			int x, y ;  x 和y是两个int类型的变量
			int x [],y[] ;x和y都是int类型的数组
			int x[][],y[] ; x是一个二维数组,y是一个一维数组

举例:

class ArrayDemo{
	public static void main(String[] args){
		//格式1:
		 int[][] arr = new int[3][2] ;
		 System.out.println(arr);//[[I@6d06d69c      //地址值
		 System.out.println(arr[0]) ;//[I@7852e922	//地址值
		 System.out.println(arr[1]) ;//[I@4e25154f	//地址值
		 System.out.println(arr[2]) ;//[I@70dea4e	//地址值
		 
		 System.out.println(arr[0][1]) ;
		 System.out.println(arr[1][1]) ;
		 
		 arr[0][1] = 10;
		 arr[0][0] = 20 ;
		 arr[1][1] = 40 ;
		 System.out.println("-----------------------") ;
		 System.out.println(arr);//[[I@6d06d69c			//地址值
		 System.out.println(arr[0]) ;//[I@7852e922		//地址值
		 System.out.println(arr[1]) ;//[I@4e25154f		//地址值
		 System.out.println(arr[2]) ;//[I@70dea4e		//地址值
		 
		 System.out.println(arr[0][1]) ;
		 System.out.println(arr[1][1]) ;
	}
}

格式:

二维数组的格式2:
	指定了一维数组的个数,一维数组的长度需要动态给定
	数据类型[][] 数组名称 = new 数据类型[m][] ;
	
	举例:
		int[][] arr = new int[3][] ;

	二维数组的格式3:
		就是静态初始化
		数据类型[][] 数组名称 =
				new 数据类型[][]{{元素1,元素2,元素3..},{元素1,元素2,元素3,...},{,}};
		简写格式:
	数据类型 [][] 数组名称 = {{元素1,元素2,元素3..},{元素1,元素2,元素3,...},{,}};
				
		举例
			int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}} ;
			
			-->简写格式
			int[][] arr = {{1,2,3},{4,5,6},{7,8,9}} ;

举例:

class Array2Demo2{
	public static void main(String[] args){
		//格式2:
		int[][] arr = new int[2][] ;
		//二维数组中有2个一维数组,长度不知道,得动态给定长度
		System.out.println(arr) ;//二维数组的地址值[[I@十六进制数据  //[[I@6d06d69c
		
		//动态给定义2个一维数组的长度
		arr[0] = new  int[2] ; //第一个一维数组给定了2个长度
		arr[1] = new  int[3] ;//第二个一维数组给定了3个长度
		System.out.println(arr[0]) ; //[I@7852e922
		System.out.println(arr[1]) ;//[I@4e25154f
	}
}

遍历:

class ArrayTest{

	public static void main(String[] args){
		
		//定义一个二维数组:格式3静态初始化
		int[][] arr = {{1,2,3},{4,5,6},{7,8,9}} ;
		
		//三个一维数组
		//第一个一维数组遍历
		for(int  x = 0 ; x < arr[0].length;x ++){
			System.out.print(arr[0][x]+" ") ;
		}
		System.out.println() ;
		
		//第二个一维数组遍历
		for(int  x = 0 ; x < arr[1].length;x ++){
			System.out.print(arr[1][x]+" ") ;
		}
		System.out.println() ;
		
		//第三个一维数组遍历
		for(int  x = 0 ; x < arr[2].length;x ++){
			System.out.print(arr[2][x]+" ") ;
		}
		System.out.println() ;
		
		//改进:其实上面代码:循环了3次---->3----就是二维数组的长度arr.length
        //二维数组的遍历
	
	    //外层循环:其实是一维数组的个数(arr.length)
	   //内层循环:其实每一个一维数组的长度(arr[x].length)
		for(int x = 0 ; x < arr.length; x ++){
			//每一个一维数组的内容
			for(int y = 0 ; y <arr[x].length; y++){
				System.out.print(arr[x][y]+" ") ;
			}
		}
		
		//变成功能----> 输出格式[元素1, 元素2, 元素3, 元素4...]
	
	}
	
}

5.方法的参数(基本数据类型、引用数据类型)

方法的形式参数分别是:基本数类型和引用类型之数组
	
	结论:
		1.形式参数如果是基本数据类型,形式参数改变对实际参数没有影响!
		2.形式参数如果是引用类型(数组,,接口),形式参数的改变对实际参数有很大影响
		
		String是特殊的引用类型,它如果作为形式参数--->特点跟1_特点一样

举例:

class ArgsDemo{
	public static void main(String[] args){
		
		//定义两个变量
		int a = 10 ;	//String s1 = "hello" ;
		int b = 20 ;	//String s2 = "world" ;
		System.out.println("a:"+a+",b:"+b) ;//10,20
		change(a,b) ;
		System.out.println("a:"+a+",b:"+b) ;//10,20 
		
		int[] arr = {1,2,3,4,5} ; //new int[]{1,2,3,4,5};
		change(arr) ;
		System.out.println(arr[1]) ;
	}
	
	//形式参数是两个数据类型数据
	public static void change(int a,int b){ //实际参数赋值给形式参数
		System.out.println("a:"+a+",b:"+b) ;//10,20
			a = b ;
			b = a +b ;
		System.out.println("a:"+a+",b:"+b) ;//20,40
	}
	
	public static void change(int[] arr){
		//遍历
		for(int x = 0 ; x  < arr.length ; x ++){
			if(arr[x]%2 ==0){
				arr[x] *= 2 ;
			}
		}
	}
}

6.面向对象

面向对象的特点:

封装、继承、多态

7.成员变量和局部变量的区别

局部变量和成员变量的区别?

1.在类中的位置不同
    成员变量:在类中方法外
    局部变量:在方法内或者方法声明上的变量

2.在内存中的位置不同
	成员变量:在堆内存中存储   跟类有关
	局部变量:在内存中存储     跟方法有关
    
3.初始化时机不一样
    成员变量:跟对象有关,即使成员变量没有赋值,系统会根据变量类型对变量进行默认初始化
    局部变量:必须在使用之前对变量进行初始化,否则会报错
    
4.生命周期不同
    局部变量:随着方法的调用而产生,随着方法的结束而消失
	成员变量:随着对象的创建而存在,随后等待GC(垃圾回收器回收)回收

举例:

// 自定义一个类 
class Variable{
	
	//int num2 = 10 ;
	int num2 ; //系统默认初始化 0
	
	
	//show方法属于Variable类的成员方法  (以后说的方法:非静态方法)
	public void show(){
		//方法中定义
		int num = 100 ;
		System.out.println(num) ;
	//	int num ; //局部变量:必须使用之前赋值,否则报错!
		//System.out.println(num) ; // 可能尚未初始化变量num
	}
}
//测试类
class VariableDemo{
	public static void main(String[] args){
		//需求:要访问Variable类中的show方法
		//创建该类对:类名 对象名 = new  类名() ;
		//对象名.show();
		Variable v = new Variable() ;
		v.show() ;
		System.out.println(v.num2) ;//对象名.成员变量;
	}
}

8.形式参数

形式参数如果是一个基本数据类型,形参的改变对实际参数没有影响. 需要什么类型的数据,传递具体的值即可!
	
	形式参数如果是一个类(具体类),那么形式参数的改变直接影响实际参数!
	
		以后研究的引用类型
		结论:
			形式参数如果传递的是一个数组类型,需要传递的该数组的对象
			
			举例:
				//调用该方法的时候,形式参数要该数组对象 int[] arr = {1,2,3,4,5} ;
				public static void printArray(int[] arr){}
				
			形式参数如果传递的是一个具体类(jdk提供的,我们自定义的),需要传递该类的具体对象

举例:

class Student{
	public void study(){....}
}
class StudentDemo{
	public void method(Student s){  
//让你创建学生对象Student 对象名  = new Student();
		s.study() ;
	}
}
class Demo{
	//求两个数据之和的功能
	public int add(int a,int b){
		return a+b; 
	}
}
//定义一个学生类
class Student{
	//成员方法
	public void study(){
		System.out.println("Good Good Study ,Day Day Up!!!") ;
	}
}

//在定义一个类StudentMethod
class StudentMethod{
//成员方法:有一个形式参数:Student
	public void method(Student s){ //如果形式参数一个具体类,需要传递该类对象
//Student s  = new Student() ; s.study();
s.study() ; //s变量访问study() ---->需要学生类具体对象才能访问这个study()
	}
}

//测试类
class ArgsDemo{
	public static void main(String[] args){
		//需求:访问Demo类中的add方法
		//创建该Demo类的具体对象
		Demo d = new Demo() ;
		int result = d.add(10,20) ;
		System.out.println("结果是:"+result) ;
		System.out.println("--------------") ;
		//需求:要访问StudentMethod类中的method方法()
		//创建StudentMethod类的对象,使用对象调用method()
		StudentMethod sm = new StudentMethod() ;
	//	sm.method(Student s) ; sm.method(s) ;//找不到符号
		//需要创建一个学生对象
		Student student  = new Student() ;
		sm.method(student) ;//引用类型作为形参--->传递的是空间地址值!
		/*
			public void method(Student s){ //将学生对象传递进来student
							
					s.study() ;  //student.study() ;
			}
		*/
	}
}

9.匿名对象

定义:

​ 没有名字的对象

格式:

	new 类名();

特点:

特点:
		   1.仅仅使用一次,使用完毕,从内存中会立即被释放掉! (节省内存空间,android移动端使用居多!)
		   2.匿名对象也可以作为参数进行传递
		   
		  注意:
			在使用匿名对象的时候,建议不使用多次!

举例:

//自定义一个学生类
class Student{
	public void study(){
		System.out.println("好好学习,天天向上!!") ;
	}
}

//自定义StudentDemo类
class StudentDemo{
	public void method(Student s){//形式参数是一个引用类型,具体类
		s.study() ;
	}
}
//测试类
class NoNameDemo{
	public static void main(String[] args){
		//需求:访问StudentDemo类中的method方法
		//创建StudentDemo类对象                 类名 对象名 = new 类名() ;
		StudentDemo sd = new StudentDemo() ;
		//创建学生类对象
		Student s = new Student() ;   //对象名称叫s (有名称的对象)
		sd.method(s) ;
		System.out.println("-------------------------") ;
		
		//使用匿名对象
		sd.method(new Student()) ;  //该学生的匿名对象作为参数传递
		
		System.out.println("-------------------------") ;
		
		//链式编程(开发中不建议这样使用,阅读性差,建议分开写)
		new StudentDemo().method(new Student()) ;	
	}
}

10.封装

private关键字的特点:

		1)private可以修饰一个类中的成员变量,也可以成员方法
		2)private修饰的成员变量或者是成员方法只能在本类中方法,外界不能访问的!(保证数据的安全性)
        3)私有化的成员变量:只能在本类中,外界不能访问的!   

举例:

class Demo{

	//定义一个成员变量
	int num = 10;
	private int num2 = 30 ; //私有修饰,只能在Demo类中访问,外界要访问需要通过公共的方法来访问!
	
	//成员方法
	public void method(){
		System.out.println(num) ;
		System.out.println(num2) ;
		System.out.println("method demo...") ;
	}
	
	//私有的成员方法
	private void function(){ //私有的方法,只能在本类中访问
		System.out.println("function demo...") ;
	}
	//公共方法
	public void show(){
		function() ;
	}
}
//测试类
class PrivateDemo{
	public static void main(String[] args){
		//创建Demo类的对象
		Demo d = new Demo() ;
		d.num = 50 ; //num成员变量在Demo类中没有被private修饰
		System.out.println(d.num) ;
		//d.num2 = 100 ; //System.out.println(d.num) ;
		//System.out.println(d.num2) ;
		System.out.println("-------------------------") ;
		
		d.method() ;
		//d.function() ;// function() 在 Demo 中是 private 访问控制
		d.show() ;
	}
}

11.this关键字

定义:

----为了区分成员变量和局部变量----java提供了一个关键字:this(代表了当前该类对象地址引用)
		
		setXXX(形参)方法,谁调用这个方法,那么this代表它(地址)

特点:(重点)

	//this.成员变量;  	  访问本类的成员变量
	//this.成员方法() 	  访问本类的成员方法
	//this() 			访问无参构造方法    访问本类的无参构造方法
	//this(xxx) ;   	访问带参构造方法    访问本类的有参构造方法

举例:

/定义一个学生类
class Student{
	//成员变量私有化
	private String name ; //姓名
	private int age; //年龄
	//提供公共的访问方法赋值 setXXX/getXXX方法 XXX对应的属性名称
	//给姓名赋值
	/*
	public void setName(String name){ 
		 name = name ; 
	}
	*/
	
	//改进
	public void setName(String name){ //"张三"
		this.name = name ;//this.name = "张三"
	}
	/*
	//给年龄赋值
	public void setAge(int age){ 
		age = age ;
	}
	*/
	public void setAge(int age){ // age = 25 局部变量
		this.age = age ; //this.age = 25
	}
	
	//获取姓名
	public String getName(){
		return name ; //此时获取的name,成员变量的name,隐藏关键了this
		//return this.name ; //其实这样的写法  //return "张三" ;
	}
	//获取年龄
	public int getAge(){ 
		return age ;// return this.age = return 25 ;
	}
	//其他的成员方法:
	public void study(){
		System.out.println("学习Java中的面向对象...") ;
	}
}
//测试类名
class StudentTest{
	public static void main(String[] args){
		//创建学生类对象
		Student s = new Student() ;
		//通过setXXX方法进行赋值 
		s.setName("张三") ;
		s.setAge(25) ;
		System.out.println(s.getName()+"---"+s.getAge());
		s.study();
	}
}

标准类格式:

一个标准类的写法:{
				1)属性私有化
				2)提供对外的公共的setXXX(形式参数)/getXXX()方法
				3)构造方法:
				  永远给出无参构造方法;
				  有参构造
              }

标准类举例:

//定义学生类 
class Student{
	//属性私有化
	private String stuId ; //学号
	private String name ;  //姓名
	private int age ;      //年龄
	private String gender ; //性别
	
	//提供无参构造方法
	public Student(){
	}
	
	//提供有参构造方法
	public Student(String stuId,String name,int age,String gender){
		this.stuId = stuId ;
		this.name = name ;
		this.age = age ;
		this.gender = gender ;
	}
	
	//提供setXXX()/getXXX()
	public void setStuId(String stuId){
		this.stuId = stuId ;
	}
	public void setName(String name){
		this.name = name ;
	}
	public void setAge(int age){
		this.age = age ;
	}
	public void setGender(String gender){
		this.gender = gender ;
	}
	//获取值
	public String getStuId(){
		return stuId ;
	}
	public String getName(){
		return name ;
	}
	
	public int getAge(){
		return age ;
	}
	public String getGender(){
	
		return gender ;
	}
	
	public void study(){
		System.out.println("学习Java...") ;
	}
	public void sleep(){
		System.out.println("学习累了睡觉") ;
	}
	
}

//测试类
class StudentTest{
	public static void main(String[] args){
		//测试学生类
		
		//方式1:无参构造方法+setXXX:赋值
		Student s = new Student() ;
		s.setStuId("90077");
		s.setName(";李四");
		s.setAge(25) ;
		s.setGender("男") ;
		
		System.out.println(s.getStuId()+"----"+
		s.getName()+"----"+s.getAge()+"----"+
		s.getGender()); 
		s.study();
		s.sleep();
		System.out.println("--------------------------");
		//方式2:通过有参构造方法赋值  (构造方法目的:对对象的数据进行初始化)
		Student s2 = new Student("911","张三",29,"女") ;
		System.out.println(s2.getStuId()+"----"+
		s2.getName()+"----"+s2.getAge()+"----"+
		s2.getGender()); 
		
		s2.study();
		s2.sleep();		
	}
}

12.构造方法

定义:

        1)方法名和类名相同
		2)没有具体的返回值类型
		3)并且连void都没有
		
		权限修饰符 + 方法名就是类名(){
			
		}
		
		构造方法主要作用:就是给该对象中的数据进行初始化!

举例:

//定一个学生类
class Student{
	
	//系统会给我们在类中提供一个无参构造方法
	public Student(){
		System.out.println("这是Student类的无参构造方法") ;
	}
	
	public void Student(){} //错误写法: 没有void 方法名和类名相同
	
}

//测试类
class ConstructorDemo{
	public static void main(String[] args){
		
		//创建一个学生对象
		Student s = new Student() ;
		System.out.println(s);//Student@十六进制数据
	}
}

注意事项:

构造方法中的注意事项:
			1)在一个类中,我们不写无参构造方法,系统会默认的提供一个无参构造方法,
			
			2)如果我们提供一个有参构造方法,系统不会在提供无参了,如果使用无参构造方法创建对象,就会报错!
					(永远建议给出无参构造方法)!

举例:

//老师类
class Teacher{

	//定义两个成员变量
	private String name ;
	private int age ;
	
	/*
		永远建议手动给出无参构造方法
	*/
	public Teacher(){
		System.out.println("手动给出了无参构造方法...") ;
	}
	
	
	//提供一个有参构造方法,带一个参数的字符串类型的
	public Teacher(String name){
		this.name = name ;//通过有参构造赋值 "张三"
		//System.out.println("这是带一个String类型参数的有参构造...") ;
	}
	//提供一个有参构造方法,带一个int类型参数的
	public Teacher(int age){
		System.out.println("这是带一个int类型的有参构造...") ;
	}
	
	public Teacher(String name,int age){
		System.out.println("这是一个带两个参数有参构造...") ;
	}
	
	//获取成员变量的值
	public String getName(){
		return name ;
	}
}
//测试类
class ConstructorDemo2{
	public static void main(String[] args){
		//通过无参构造方法创建对象
		//Teacher t = new Teacher() ;// 对于Teacher(没有参数), 找不到合适的构造器
		
		//提供无参构造方法:
		Teacher t = new Teacher() ;
		System.out.println(t);
		System.out.println("------------------------") ;
		//创建一个新的Teacher对象,通过带一个String类型的构造方法
		Teacher t2 = new Teacher("张三") ;
		System.out.println(t2.getName()) ;
		System.out.println(t2);
		System.out.println("------------------------") ;
		Teacher t3 = new Teacher(39) ;
		System.out.println(t3);
		System.out.println("------------------------") ;
		//给成员变量赋值:有参构造方法初始化
		//		setXXX(形参)
		Teacher t4 = new Teacher("张三",39) ;
		System.out.println(t4);
		
	}
}

13.成员方法

成员方法的分类:(非静态的成员方法)
		两种情况:
			要么有返回值类型
				1)有返回值类型,并且有参数
				2)有返回值类型,没有参数
			要么没有具体返回值:void代替
				1)没有返回值类型,带参
				2)没有返回值类,不带参

举例:

class StudentDemo{
	//定义成员方法
	
	//有返回来类型的情况
	
	//有返回值,带参
	public String method(String str){
		return "hello"+str;
	}
	
	//有返回值,不带参的
	public String function(){
		return "hello JavaEE" ;
	}
	
	//没有返回值类型的情况
	
	//没有返回值带参的 :void代替返回值类型
	public void  show(int num){
		System.out.println(num);
		function2() ;
	}
	
	//没有返回值,不带参的
	private void function2(){
		System.out.println("function2 StudentDemo") ;
	}
	
}
//测试类
class MethodDemo{
	public static void main(String[] args){
			//访问这些成员方法:
			//创建对象 :类名  对象名 = new 类名();
			StudentDemo sd = new StudentDemo() ;
			String result = sd.method("world") ;
			System.out.println(result) ;
			
			String s2 = sd.function() ;
			System.out.println(s2) ;
			
			sd.show(100) ;
			//sd.function2() ;//function2() 在 StudentDemo 中是 private 访问控制
			
	}
}

14.static关键字

内存图解:
内存图解

静态static的特点:
		1)static修饰的变量/方法   **随着类的加载而加载**
			
				class xxx{} ----> 通过javac 编译xxx.java文件		--->编译没有问题(Java语法校验)
							---->产生xxx.class文件   
							
								java xxx类
                    
		2)static修饰的          **优先于对象存在**
                    
			main() :被静态修饰符: jvm调用它
				public static void main(String[] args){
					
				}
				
		3)static修饰的可以被多个对象共用 
			有共享,共用
			
		4)被静态修饰的成员变量或者成员方法 ,
				可以被类名直接访问(推荐访问方式)
					类名.成员变量;
					类名.成员方法();
				
		注意:也可以用该类对象来访问该成员(不推荐!)

注意事项:

static关键字的注意事项:
	
		1)static,是没有this关键字的! (this:代表当前类的对象的地址值,对象已经创建了而static修饰的和类有关系);
		2)关于成员方法的访问问题:

				非静态的成员方法
					既可以访问静态的成员变量,也可以访问非静态的成员变量
					既可以访问静态的成员方法,也可以访问非静态的成员方法;
				
				静态的成员方法
					记住:静态只能访问静态

什么时候定义局部变量什么时候定义成员变量:

问题:什么时候将变量定义为成员变量? 

	如果变量能够描述生活中事物的属性的话,这个时候将变量定义为成员变量;否则,就局部变量
	
	实际开发中,变量的范围越小越好 (局部变量)

15.文档注释

在ArrayDemo类中测试一个针对数组操作的工具类
	
	1)工具类ArrayTool---> 无参构造私有化了
	
	2)定义相关的功能(静态的功能)
	3)提供相关文档注释              格式:  /** 文档注释 */
	在类上以及方法上都需要加上文档注释
	
	4)针对ArrayTool工具类---->产生描述该类的文档 
			在dos中:javadoc -d 目录名字  -author -version ArrayTool.java

举例:

该类是自定义的针对数组操作的工具类
	@author apple
	@version V1.0
*/
public class ArrayTool{
	
	//无参构造私有化,目的:外界不能直接创建对象!
	private ArrayTool(){
	
	}
	
	/**
		该方法是针对数组遍历的功能,将数组以[元素1, 元素2, ..]该格式输出
		@param arr 需要被遍历的数组
	*/
	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] +", ") ;
			}
		}
	}
	/**
		该方法是获取数组中的最大值
		@param arr 在指定的数组中获取最大值
		@return 返回最大值
	*/
	public static int getMax(int[] arr){
		//定义参照物
		int max = arr[0] ;
		for(int x = 1 ; x < arr.length ; x ++){
			if(arr[x] > max){
				max = arr[x] ;
			}
		}
		return max ;
	}
	/**
		该方法是在指定的数组中查询指定元素角标值
		@param arr 在指定的数组中查询
		@param key 要查询的指定数组中元素
		@return 如果查找到了,返回该角标值,如果没有查找到,返回-1
	*/
	public static int getIndex(int[] arr,int key){
			//假设实现
			int index = -1 ;
			for(int x = 0 ; x < arr.length ; x ++){
				if(arr[x] == key){
				   index = x ;
				   break ;
				}
			}
			return index ;
	}
}

16.创建对象做了哪些事

内存图解:
内存图解

1).加载Student.class

2).在栈内存空间中开辟栈内存空间

3).在堆内存中申请空间

4).对数据进行初始化(成员变量)
	4.1)系统默认初始化
	4.2)显示初始化--setXXX(形参)/构造方法赋值	
5)堆内存中申请空间完毕,产生一个堆内存地址

6)将堆内存地址赋值给栈内存变量

7)栈内存变量s指向的堆内存地址

16.创建对象做了哪些事

1).加载Student.class

2).在栈内存空间中开辟栈内存空间

3).在堆内存中申请空间

4).对数据进行初始化(成员变量)
	4.1)系统默认初始化
	4.2)显示初始化--setXXX(形参)/构造方法赋值	
5)堆内存中申请空间完毕,产生一个堆内存地址

6)将堆内存地址赋值给栈内存变量

7)栈内存变量s指向的堆内存地址
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值