A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 方方方 中级黑马   /  2019-3-8 18:07  /  786 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

技术贴
===========================================================
JAVA的内存需要划分成为5个部分:
1.栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
       局部变量:方法的参数,或者是方法{}内部的变量。
       作用域:一旦超过作用域,立刻从栈内存当中消失。
2.堆(Heap);凡是new出来的东西,都在堆当中。
       堆内存里面的东西都有一个地址值:16进制
       堆内存里面的数据都有默认值。规则如下:
       整数       0
       浮点数   0.0
       字符       ’\u0000‘
       布尔       false
       引用类型       null
3.方法区(Method Area):存储.class相关信息,包含方法的信息。
4.本地方法栈(NativeMethod Stack):与操作系统相关。
5.寄存器(PC Register):与CPU相关。
===========================================================
方法定义格式:
public static void 方法名称(){
    方法体
}
调用格式:
方法名称();
注意事项:
1.方法定义的先后顺序无所谓。
2.方法定义必须是挨着的,不能在一个方法的内部定义另外一个方法。
3.方法定义之后,自己不会执行,如果希望执行,一定要进行方法的调用。
定义方法的完整格式:
修饰符 返回值类型 方法名称(参数类型 参数名称......){
    方法体
   return 返回值;
}
修饰符:现阶段的固定写法,public static
返回值类型:也就是方法最终产生的数据结果是什么类型。
方法名称:方法的名字,规则和变量一样,小驼峰
参数类型:进入方法的数据是什么类型
参数名称:进入方法的数据对应的变量名称
ps:参数如果有多个,使用逗号进行分隔
方法体:方法需要做的事情,若干行代码
return:两个作用,第一停止当前方法,第二将后面的返回值还给调用处。
返回值:也就是方法执行后最终产生的数据结果。
注意:return后面的“返回值”,必须和方法名称前面的“返回值类型”保持一致。
定义一个两个int数字相加的方法,三要素:
返回值类型:int
方法名称:sum
参数列表:int a,int b
方法的三种调用格式:
1.单独调用:方法名称(参数);
2.打印调用:System.out.println(方法名称(参数));
3.赋值调用:数据类型 变量名称=方法名称(参数);
注意:此前学习的方法,返回值固定类型写为void,这种方法只能够单独调用,不能进行打印调用或者赋值调用。
对于有返回值的方法,可以使用单独调用、打印调用、或者赋值调用。
对于无返回值的方法,只能使用单独调用,不能使用打印调用或者赋值调用。
有参数:小括号当中有内容,当一个方法需要一些数据条件才能完成任务的时候,就是有参数。
例如:两个数字相加,必须知道两个数字是多少。
无参数:小括号当中留空。一个方法不需要任何数据条件,自己就能独立完成任务。
例如:定义一个方法,
方法的注意事项:
1.方法应该定义在类当中,但是不能在方法当中再定义方法。不能嵌套。
2.方法定义的前后顺序无所谓。
3.方法定义之后不会执行,如果希望执行,一定要调用:单独调用、打印调用、赋值调用。
4.如果方法有返回值,那么必须写上“return返回值;”,不能没有。
5.return后面的返回值数据,必须和方法的返回值类型对应起来。
6.对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己。
7.对于void方法当中最后一行的return可以省略不写。
8.一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到。两个不能连写。
对于功能类似的方法来说,因为参数列表不一样,却需要记住那么多不同的方法名称,太麻烦。
方法的重载(Overload):多个方法的名称一样,但是参数列表不一样。
好处:只需要记住唯一一个方法名称,就可以实现类似的多个功能。
方法重载与下列因素相关:
1.参数个数不同
2.参数类型不同
3.参数的多类型顺序不同
方法重载与下列因素无关
1.与参数的名称无关
2.与方法的返回值类型无关
===========================================================
数组的概念:数组是一种容器,可以同时存放多个数据值。
数组的特点:
1.数组是一种引用数据类型。
2.数组当中的多个数据,类型必须统一。
3.数组的长度在程序运行期间不可改变。
数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。
两种常见的初始化方式:
1.动态初始化(指定长度)
2.静态初始化(指定内容)
动态初始化数组的格式:
数据类型[] 数组名称 = new 数据类型[数组长度];
解析:
左侧数据类型:就是数组当中保存的数据,全部都是统一的类型
左侧的中括号:代表一个数组
左侧数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧数据类型:必须和左侧的数据类型保持一致
右侧中括号的长度:就是数组当中到底可以保存多少个数据,是一个int数字
动态初始化(指定长度):在创建数组的时候,直接指定数组当中的数据元素个数。
静态初始化(指定内容):在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。
静态初始化基本格式:
数据类型[] 数组名称 = new 数据类型[] { 元素1,元素2.....};
注意事项:
虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度。
使用静态初始化数组的时候,格式还可以省略一下。
标准格式:
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,......};
省略格式:
数据类型[] 数组名称 = {元素1,元素2,......};
注意事项:
1.静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
2.静态初始化标准格式可以拆分成为两个步骤。
3.动态初始化也可以拆分成为两个步骤。
4.静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。
使用建议:
如果不确定数组当中的具体内容,用动态初始化;否则已经确定了具体的内容,用静态初始化。
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:
如果是整数类型,那么默认值为0;
如果是浮点类型,那么默认值为0.0;
如果是字符类型,那么默认值为‘\u0000’;
如果是布尔类型,那么默认值为false;
如果是引用类型,那么默认值为null。
注意事项:
静态初始化其实也有默认值的过程,只不过系统马上自动将默认值替换成为了大括号党当中的具体数值
package cn.itcast.day05.demo03;
/*
数组元素的反转:
本来的样子:[1,2,3,4,5,]
之后的样子:[5,4,3,2,1]
要求不能使用新数组,就用原来唯一的一个数组
*/
public class Demo07ArrayReverse {
   public static void main(String[] args){
       int[] array = {10,20,30,40,50};
       //遍历所有数组本来的样子。
       for (int i = 0;i < array.length; i++){
           System.out.println(array);
       }
       System.out.println("===========");
       /*
       初始化语句:int min=0, max=array.length-1,
       条件判断:min<max
       步进表达式:min++,max--
       循环体:用第三个变量倒手
        */
       for (int min=0,max=array.length-1;min<max;min++,max--){
           int temp = array[min];
           array[min] = array[max];
           array[max] = temp;
       }
       //再次打印遍历输出数组后来的样子
       for(int i = 0;i < array.length;i++){
           System.out.println(array);
       }
    }
}
/*
数组可以作为方法的参数。
当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值。
*/
/*
一个方法可以有0、1、2、3......多个参数,但是只能有0或者1个返回值,不能有多个返回值。
如果希望一个方法当中产生多个结果数据进行返回,怎么办?
解决方案:使用一个数组作为返回值类型即可。
任何数据类型都能作为方法的参数类型或者返回值类型。
数组作为方法的参数,传递进去的其实是数组的地址哈希值。
数组作为方法的返回值,返回的其实也是数组的地址哈希值.
*/
===========================================================
/*
面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
面向对象:当需要实现一个功能的时候,不关心具体步骤,而是找一个已经具有该功能的人,来帮助。
三大基本特征:封装、继承、多态。
*/
/*
成员变量(属性):String name;//姓名
                   int age;//年龄
成员方法(行为):public void eat(){}//吃饭
                  public void sleep(){}//睡觉
                  public void study(){}//学习
注意事项:
1.成员变量是直接定义在类当中的,在方法外边。
2.成员方法不要写static关键字。
*/
/*
通常情况下,一个类并不能直接使用,需要根据类创建一个对象才能使用。
1.导包:就是指出需要使用的类在什么位置。
import 包名称.类名称;
import cn.itcast.day06.Demo01.Student;
对于和当前类属于同一个包的情况,可以省略导包语句不写。
2.创建。格式:
类名称 对象名 = new 类名称();
Student stu = new Student();
3.使用。分为两种情况:
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)
注意事项:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
*/
/*
局部变量和成员变量
1.定义的位置不一样【重点】
局部变量:在方法的内部。
成员变量:在方法的外部,直接写在类当中。
2.作用范围不一样【重点】
局部变量:只有方法当中才可以使用,出了方法就不能再用.
成员变量:整个类全都可以通用。
3.默认值不一样【重点】
局部变量:没有默认值,如果想要,必须手动进行赋值。
成员变量:如果没有赋值,会有默认值,规则和数组一样。
4.内存的位置不一样(了解)
局部变量:位于栈内存。
成员变量:位于堆内存。
5.生命周期不一样(了解)
局部变量:随着方法进栈而诞生,随着方法出栈而消失。
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。
*/
/*
问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来。
解决方案:用private关键字将需要保护的成员变量进行修饰。
一旦使用了private进行修饰,那么本类当中仍然可以随意访问。
但是超出了本类范围之外就不能再直接访问了。
间接访问private成员变量,就是定义一对Getter/Setter方法
命名规则:setXxx或者getXxx
对于Getter来说,不能有参数,返回值类型和成员变量对应。
对于Setter来说,不能有返回值,参数类型和成员变量对应。
*/
/*
面向对象三大特征:封装、继承、多态
封装性在Java当中的体现:
1.方法就是一种封装。
2.关键字private也是一种封装。
封装就是将一些细节信息隐藏起来,对于外界不可见。
*/
/*
当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。
如果需要访问本类当中的成员变量,需要使用格式:
this.成员变量名
“通过谁调用的方法,谁就是this”
*/
/*
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
格式:
Public 类名称(参数类型 参数名称){
    方法体
}
注意事项:
1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样。
2.构造方法不要写返回值类型,连void都不写。
3.构造方法不能return一个具体的返回值。
4.如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做。
public Student(){}
5.一旦编写了至少一个构造方法,那么编译器将不再赠送。
6.构造方法也是可以进行重载的。
重载:在同一个类中,方法名称相同,参数列表不同。
*/
/*
一个标准的类通常要拥有下面四个组成部分:
1.所有的成员变量都要使用private关键字修饰。
2.为每一个成员变量编写一队Getter/Setter方法。
3.编写一个无参数的构造方法。
4.编写一个全参数的构造方法。
这样标准的类也叫做Java Bean
*/
===========================================================

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马