欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java复习,

来源: javaer 分享于  点击 23485 次 点评:227

java复习,


         

一.Java概述

1.1 Java历史、发展、现状
         ◆历史:

         1990年:SUN公司启动green计划

         1992年: 创建Oak(橡树)语言—》Java

         1994年: JamesGosling参加硅谷大会,通过java 编写的浏览器WebRunner演示了java 的功能,并震惊世界

         1995年: sun发布JDK第一个版本 JDK1.0 目前已经到了JDK8

         2009年:Oracle收购了SUN公司。

 

◆现状

         Java技术已经成为世界上最卓越的企业应用移动应用开发平台之一

 

◆发展

安卓、物联网、云计算、大数据

 

 

1.2 Java的特点

Java的白皮书中说:“Java是一种

简单的、

解释的、

健壮的、

安全的、

高效的、

多线程的

分布式的、

可移植的、

动态的语言、

结构中立的、

面向对象的、

 

 

1.3 Java运行机制

         Java语言是一种特殊的高级语言,他既具有解释型语言的特点,也有编译型语言的特点,因此Java程序需要经过先编译、后解释执行两步。(偏重于解释型语言)

编译型语言:使用专门的编译器,针对特点平台(操作系统)将某种高级语言一次性编译成该平台可以执行的机器码。 CC++

解释型语言:使用专门的解释器,对源程序逐行解释成特定平台的机器码并立即执行的语言。

                     RubyPython

 

 

 

JDKJREJVM概念:

 

JDKJavaDevelopment Kit  Java标准开发包)

JDK是美国SUN公司提供的一套用于开发java应用程序的开发包,他提供了编译和运行java程序所需的各种工具和资源。它包含:JRE,Java工具,Java基础类库。

 

                            ------- JRE(Java Runtime Environment)Java运行时环境

|

JDK----------|------ java的工具:  javac.exe(java编译器)

|                java.exe(java解释执行器)

|

                      -------java的类库:(3600多个)  常用的150多个

 

       JRE(JavaRuntime Environment   Java运行时环境)

JRE是Java程序运行的必须条件,如果我们只想运行java程序,可以只用安装JRE,而不需要安装JDK。但是如果我们要开发Java程序,必须安装JDK。

 

       JVM(Java Virtual Machine   Java虚拟机)

JVM是负责解释执行字节码文件。相同的字节码文件要想在不同的平台(操作系统)上运行是不可能的,只有通过中间的转换器才可以实现,JVM就是充当了这个转换器。Java是通过JVM实现跨平台的,跨平台也是java最大的优势之一。

 

       JREJVM的联系与区别:

JRE包含JVMJVM是运行java程序的核心虚拟机,他负责解释执行字节码文件,但是java程序运行不仅仅需要jvm,还需要其他的资源,例如:类,类加载器,字节码校验器….. JRE处理包含JVM外,还拥有Java程序运行所需的所有资源。

 

        

1.4 JDK安装与配置

安装:

下载JDK直接安装即可

 

配置:

安装完成JDK后, 我的电脑—》右键—》属性—》高级系统设置—》高级—》环境变量—》下面 系统变量 选择path—》变量中后面追加  ; C:\Program Files\Java\jdk1.7.0_45\bin –》确定即可。

 

配置完成后,打开DOS窗口 输入 javac 、java命令测试

 

 

1.5第一个java程序

◆第一步:编写源程序

新建记事本,重命名为Hello.java  编写如下代码

public classHello{

         public static void main(String[] args){

                   System.out.println("HelloWorld!我的第一个java程序!");

         }

}

 

◆第二步:javac命令编译

进入dos窗口,用cd命令切换路径到Hello.java所在位置。使用javac编译

如果代码没有错误,编译成功,生成Hello.class字节码文件

如果代码有错误,会提示错误,我们需要修改错误再重新编译。

 

◆第三步:java解释执行

接着上面一步,编译生成字节码文件后

 

1.6 Java两大机制

³    Java两大核心机制   JVMGC

² Java虚拟机(Java Virtual Machine   

±  Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”

² 垃圾收集机制(Garbage Collection

±  在 C/C++ 等语言中,由程序员负责回收无用内存。

±  Java 不需要程序员负责回收无用的内存:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。

±  垃圾回收在 Java 程序运行过程中自动进行,程序员无法精确控制和干预。

 

一、          Java中的注释和javadoc命令

注释:用来说明某段代码的作用,某个类的用途,某个方法的功能…….

 

Java中注释分为三类:单行注释,多行注释,文本注释。

         单行注释:       //注释内容

 

         多行注释:                /*

                                                      注释内容

                                                      ……

                                                      注释内容

                                             */

 

         文档注释:                /**

                                               *注释内容

                                               * ……

                                               *注释内容

                                              */

 

         写完文档注释后可以生产API。API可以帮助用户学习和理解改程序。

         进入dos窗口,使用cd命令进入Hello.java所在路径,输入javadoc Hello.java

 

二、          Java的分隔符

Java语言中(;) 、({})、 ([])、 (())、 (,)、 (.)、 ( )都具有特殊分隔作用,因此他们统称为分隔符。

▼分号 ;

                  用作语句分隔。Java中语句分隔不是使用回车,而是使用分号。每个java必须以;结尾。Java代码中允许一行写多条Java语句,但是每条Java语句中必须以;分隔开来。

 

▼花括号 {}

                  定义一个代码块。

                  注意:有一个”{”必须有一个”}”与之对应

 

▼方括号 []

                  用来访问数组元素。

 

▼圆括号 ()

                  定义方法时使用();

                  表达式中某一部分是一个整体,保证表达式的优先级 (10+3)/2

                  强制类型转换

 

▼逗号 ,

                  变量声明时分隔多个变量 int a,b,c;

                  方法定义时分隔多个参数  int max(int a,int b,int c){}

                  数组中变量值的风格      int[] a = {1,2,3,4,5};

 

▼圆点 .

                  类/对象和定义的成员之间的分隔符,表明调用某个类或对象的某个指定成员。eg: System.out.println();              p.age

 

▼空格

                  分隔一条语句的不同部分。空格几乎可以出现在代码的任何部分,也可以出现任意多个空格。

 

三、Java标示符的定义原则和关键字

           ▼标示符:所谓标示符就是给程序中类、方法、变量命令的符号。

 

           public class Demo{

                  public static void main(String[] args){

                         inta = 10;

                         System.out.println(a);

}

}

上面代码中 Demo类名、main方法名、a变量名

 

▼标示符命名规则:

         Java语言中标示符必须以字母、下划线(_)、美元符号($)开头,后面可以跟上任意数目的字母、数字、下划线(_)、美元符号($)。此处的字母不仅仅是26个英文字母,还可以是中文字符、日文字符…….

       注意:标示符不能包括空格,不能使用java的关键字和保留字和直接量,标示符的长度不受限制。

由于Java采用的Unicode编码,因此Java的标示符可以使用Unicode能够表示的任意字符。Java语言严格区分大小写,因此Abcabc是不用的标示符。

 

▼Java关键字、保留字

         关键字 48个        

                  Java语言中有一些具有特殊用途的单词被称为关键字(KeyWord) eg: if  for while…..(见课本P47页)

 

         保留字 2个

                  Java共有48个关键字,除了这48个关键字外还有goto、const这两个保留字。(Java现在还没有使用它们作为关键字,但是将来的版本中可能使用它们做为关键字)

 

         直接量 3个

                  Java中还有三个直接量也不能作为标示符: true  false null

 

注意:java中关键字、保留字、直接量都是小写,If,For都可以用来作为标示符。(Java严格区分大小写)

 

四、基本数据类型

Java语言是强类型,每一个表达式或者变量都有一个在编译时就确定好了的类型,所有变量需要先声明后使用。

Java中数据类型包括 基本数据类型 引用数据类型(复杂数据类型)两大类

                                                      8              数组、类、接口

★基本数据类型(48)

 

1.整数类型

类型

存储需求

取值范围

byte

1字节

–128 到 127

short

2字节

–32,768 到 32,767

int

4字节

–2,147,483,648到 2,147,483, 647 (刚刚超过20亿)

long

8字节

–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

        

         整型:表示没有小数部分的数值,可以是负数。

 

         ▶▶ 一般情况下面int最常用,因此Java中一个整型常量默认为int。长整型后需要添加一个后缀L或l 。(eg:  int a = 10;  long a = 10L);

    ▶▶ 如果直接将一个较小的整形常量(在byte,short范围内的数据)赋给一个byte或short类型的整型变量,系统自动将该值当做byte或short类型来处理。如果系统使用一个巨大的数据,超过了int的范围,Java不会自动将他当做long类型处理,要想当成long类型必须在后面加上L或l。

        案例:

            byte a = 56;//正确

            short b = 3000;//正确

long c = 300000000000000000;//错误,系统还是将300000000000000000

//int类型处理,但是300000000000000000超过了int//范围,所以会报错,必须在300000000000000000后面加//Ll系统才会把300000000000000000当做long类型

 

▶▶Java中整形常量有三种表示方式:十进制、八进制、十六进制

    默认是十进制,八进制数据以0开头,十六进制数据以0x或0X开头

 

    案例:

public class Test1{

         publicstatic void main(String[] args){

                  int a = 12;

                  int b = 012;    

                  int c = 0x12;

                  System.out.println(a);//12

                  System.out.println(b);//10

                  System.out.println(c);//18

         }

}

五、变量的声明,初始化,作用域,常量

       ▼变量声明

                  eg:

                           int days;//天数

                           int age;//年龄

                           int a,b,c;

 

         ▼初始化

                  eg

                           days = 25;

                           age = 18;

                           a = 10;

                           b = 10;

                           c = 5;

 

         可以将变量声明和初始化合并成一部完成

                           int days = 25;

                           int age = 18;

                           int a=10,b=10,c=5;

 

         注意:声明了一个变量后,一定要初始化才可以使用改变量。

                  eg:

                           public class Test2{

                                    publicstatic void main(String[] args){

                                             int a;

                                             System.out.println(a); //此处报错 (可能尚未初始化变量 a)

                                    }

}

 

         ▼动态初始化

                  eg int a = 10;

                            int b = a;

         整型变量b的初始化是将a的值赋给了b,这就是动态初始化。

         注意如果a没有初始化,就不允许用a作为其他变量的初始化值。

                  egint a;

                      int b = a;//此处报错

 

 

         ▼常量

                           常量:不能改变的量,值是固定的。

public class Test2{

     public staticvoid main(String[] args){

              int a = 10;

              final int MONTHS = 12;//常量 (常量名一般大写,便于和普通变量区分)

              System.out.println("a="+a+",MONTHS ="+ MONTHS);

              a = 20;

              MONTHS = 15;//报错 无法为最终变量 months 指定值(常量的值不可以改变)

              System.out.println("a="+a+",MONTHS ="+ MONTHS);

     }

}

 

六、数据类型的转换

       Java八种基本数据类型有两种转换方式:自动类型转换、强制类型转换

       boolean类型不可以和其他任何类型相互转换。

 

       ▼自动类型转换

                  条件:a.类型兼容

                           b.目标类型大于源类型

   

                 

              eg:

                           bytea = 12;

                           intb = a;//自动类型转换

 

                           inta = 123;

                           doubleb = a;//自动类型转换

 

▼强制类型转换

         有时候需要将大类型的数据转换成小类型使用。Eg:需要将double类型的数据转换成int类型使用,此时可能损失精度,必须使用强制类型转换。注意,强制类型转换不可以乱用。

 

         eg

                  double a = 123.5;

                  int b = (int)a;//强制类型转换

 

                  int a = 233;

                  byte b = (byte)a;//强制类型转换,结果是(-23) 因为byte范围是-128127 损失精度

 

 

▼表达式类型提升

î  当使用二元运算符对两个值进行运算时,两个操作数会转换成通用类型。

î  如果两个操作数中有一个是double类型,则另一个将会转换成double型;

î  如果两个操作数中有一个是float类型,则另一个将会转换成float型;

î  如果两个操作数中有一个是long类型,则另一个将会转换成long型;

î  否则,两个操作数都转换成int型。

 

 

î  字符串和所有基本数据类型,基本数据类型都会转换成字符串。

eg:

         System.out.println("abc"+1+2);//输出 abc12

         System.out.println("abc"+(1+2));//输出 abc3

 

 

案例:

public class Demo1{

publicstatic void main(String[] args){

         int a,b;

         double c,d;

         a = 10/3;

         b = (int)(10/3.0); //强制类型转换

         c = 10/3; //自动类型转换

         d = 10/3.0;

         System.out.println(a);

         System.out.println(b);

         System.out.println(c);

         System.out.println(d);

}

}

 

七、运算符的使用

     ▼算术运算符  +   -  *   /    %

                                              取模(取余)

 

     ▼自增自减运算符++  --

                                         自增   自减

            案例一:

                                int i = 5;

                                i++;

                                System.out.println(i);//6

 

                                    inti = 5;

                                ++i;

                                System.out.println(i);//6

总结:单独写i++ 或者 ++i 没有任何区别

 

            案例二:

                  int i = 5;

                  int j = i++;//j=i  i=i+1 

                  System.out.println("i="+i+"   j="+j);//i=6  j=5

 

                  int i = 5;

                  int j = ++i;//i=i+1  j=i

                  System.out.println("i="+i+"   j="+j);//i=6  j=6

总结:在运算时 j = i++ 相当于先把i的值给到j,再让i自增

                            j = ++i 相当于先把i的值自增,在把i的值给到j

 

案例三:

                  int i = 5;

                  System.out.println(i++);//5

 

                  int i = 5;

                  System.out.println(++i);//6

 

总结:在输出时,i++相当于先输出i,在让i自增

                             ++i 相当于先让i自增,在输出i

 

▼关系运算符>   >=   <    <=   ==  !=                                           

                 大于    大于等于   小于  小于等于   等于   不等

    

关系表达式得到的结果是truefalse   

▼逻辑运算符&&     ||         ^                    &     |  

                                            异或                        

 

              && || 是按照短路的方式来求值的。如果第一个操作数已经能够确定表达式的值,则不会计算第二操作数。

                       eg:(5>6) &&  (5>1)

                       前面5>6已经为false,已经可以确定整个表达式的值为false后面就不计算。

 

              & |   是按照非短路方式来求值的。即使第一个操作数已经能够确定表达式的值,还是要计算第二个操作数。

                       eg:(5>6) &  (5>1)

                       前面5>6已经为false,已经可以确定整个表达式的值为false后面仍然要计算。

 

 

              ^:两个操作数不同返回true,相同返回false

              eg:

                                (5>6) ^ (5>7)   false

                                (5<6) ^ (5<7)   false

                                (5>6) ^ (5<7)      true

 

 

▼位运算符&     |      ^

                       位运算符用于整数之间的位运算,将两个整数转换成2进制来运算

                       &按位求与 (两个1就为,其他都为0)

                       |  按位求或 (有一个1 就为1)

                       ^异或 (两个相同为不同为1)

 

                       eg

             

                       5& 7 = 5                                      5|7= 7                                5^7= 2

                        

                       101                                               101                                      101

              &      111                                      |      111                             ^     111

               ---------                                      -------------                          ------------

                       101                                             111                                      010

               

                      

     ▼赋值运算符=

                       注意将 = ==区分开来。= 是赋值   == 是判断是否相等

 

 

补充:键盘输入数字

import java.util.*;//1.导入包

public class Demo1{

         public static voidmain(String[] args){

                  int a;

                  Scanner s = new Scanner(System.in);//2.初始化一个对象 s

                  System.out.println("请输入a的值:");

                  a = s.nextInt();//3.从键盘输入一个值给到a

                  System.out.println("你从键盘输入的值是:"+a);

         }

}

 

import java.util.*;//1.导入包

public class Demo1{

         public static voidmain(String[] args){

                  int a,b,sum;

                  Scanner s = new Scanner(System.in);//2.初始化一个对象 s

 

                  System.out.println("请输入a的值:");

                  a = s.nextInt();//3.从键盘输入一个值给到a

 

                  System.out.println("请输入b的值:");

                  b = s.nextInt();//3.从键盘输入一个值给到b

 

                  sum = a+b;

                  System.out.println(sum);

         }

}

一、          程序的三种结构

基本上所有编程语言中,程序都有三种结构:顺序结构、分支(选择)结构、循环结构。Java也不例外。

 

顺序结构:自上而下的逐行执行代码。

选择结构:根据逻辑判断,有选择的执行其中某部分代码。

循环结构:根据逻辑判断,重复执行某个代码块。

 

二顺序结构程序设计

前面案例中代码块中没有用if、switch、for、while等的,都是顺序结构

 

eg:从键盘输入一个三位整数,求出它的个位、十位、百位。

import java.util.*;

public class Demo1{

public static void main(String[]args){

int a,gw,sw,bw;

System.out.println("请输入一个三位整数:");

Scanner s = newScanner(System.in);

a = s.nextInt();

gw = a%10;// 123%10=3

sw = (a/10)%10;// 123/10=12  12%10=2

bw = a/100;// 123/100=1

System.out.println(a+"的个位="+gw+",十位="+sw+",百位="+bw);

}

}

 

 

三、          分支(选择)结构程序设计

★  if分支结构

   ▼单分支

          语法:

                      if(表达式){

                               代码块;

}

                           说明:

                                    如果表达式为true,执行if中的代码块,否则不执行

 

案例: 从键盘输入小明的Java语言考试成绩score,如果score>=60 就输出"恭喜你,考试及格!";

import java.util.*;

public class Test6{

     publicstatic void main(String[] args){

              int score;

              Scanner s = new Scanner(System.in);

              System.out.println("请输入小明的Java成绩:");

              score = s.nextInt();

              if(score>=60){

                       System.out.println("恭喜你,考试及格!");

              }

     }

}

▼二路分支

语法:

                      if(表达式){

                               代码块1;

}else{

         代码块2;

}

                           说明:

                                    如果表达式为true,执行if中的代码块1

                                    如果表达式为false,执行else中代码块2

 

案例一: 从键盘输入小明的Java语言考试成绩score,如果score>=60 就输出"恭喜你,考试及格!"; 否则就输出"很抱歉,准备补考!"

import java.util.*;

public class Test1{

     publicstatic void main(String[] args){

              int score;

              Scanner s = new Scanner(System.in);

              System.out.println("请输入小明的java成绩:");

              score = s.nextInt();

              if(score>=60){

                       System.out.println("恭喜你,成绩合格!");

              }else{

                       System.out.println("很抱歉,准备补考!");

              }

     }

}

 

▼嵌套分支结构

public class Test7{

     publicstatic void main(String[] args){

              int a=10,b=15,c=20;

              if(a>b){

                       if(a>c){

                                System.out.println("最大值="+a);

                       }else{

                                System.out.println("最大值="+c);

                       }

              }else{

                       if(b>c){

                                System.out.println("最大值="+b);

                       }else{

                                System.out.println("最大值="+c);

                       }

              }

     }

}

switch

语法:

switch(表达式){  // JDK6 中表达式类型只能为 byte short int char

case 1:                // JDK7中表达式类型只能为 byte short int char String

         语句块1;break;

case 2:

         语句块2;break;

……

……// 中间可以有ncase

……

default:   //最后这个default可有可无

         语句块n;

}

 

                           说明:

根据switch后面括号中表达式的值去依次和case后面的值比较,如果遇到了匹配的就从这个case进入,执行后面的代码块,不再判断是否与后面的casedefault标签后面的值是否匹配,直到遇到break才停止。如果没有遇到匹配的值则执行default中的代码块。

 

                           案例一: 从键盘输入月份month,输出对应的季节

                                    3.4.5 春季    6.7.8 夏季    9.10.11 秋季     12.1.2 冬季

 

import java.util.*;

public class Test5{

     publicstatic void main(String[] args){

              int month;

              Scanner input = new Scanner(System.in);

              System.out.println("请输入月份:");

              month = input.nextInt();

              switch(month){

                       case3:

                       case4:

                       case5:

                                System.out.println("春季");

                                break;

                       case6:

                       case7:

                       case8:

                                System.out.println("夏季");

                                break;

                       case9:

                       case10:

                       case11:

                                System.out.println("秋季");

                                break;

                       case12:

                       case1:

                       case2:

                                System.out.println("冬季");

                                break;

                       default:

                                System.out.println("你的输入有误!");

              }

     }

}

 

四、          循环结构程序设计

★  while

语法:

         while(表达式){

                  循环体

}

说明:

判断表达式的值如果为true,执行循环体,循环体执行完了又回到前面判断表达式的值,如果表达的值为true,又执行循环体……依此循环,直到表达式的值为false,循环结束。

 

案例一:编写程序,求出1+2+3+….+100的和

public class Test13{

     publicstatic void main(String[] args){

              int i = 1;

              int sum = 0;

              while(i<=100){

                       sum= sum+i;

                       i++;

              }

              System.out.println(sum);

     }

}

 

★  do…while

语法:

         do{

                  循环体

} while(表达式);

 

说明:

先执行循环体,循环体执行完了判断表达式,如果表达的值为true,又回到前面执行循环体,循环体执行完了又判断表达式……依此循环,直到表达式的值为false,循环结束

 

案例一:编写程序,求出1+2+3+….+100的和

public class Test15{

     publicstatic void main(String[] args){

              int i = 1;

              int sum = 0;

              do{

                       sum= sum+i;

                       i++;

              }while(i<=100);

              System.out.println(sum);

     }

}

 

★  for

语法:

for(语句1;语句2;语句3){

         循环体;

}

 

语句1:初始化循环变量

语句2:循环条件

语句3:循环增量

说明:

                                首先执行语句1

              再判断语句2,如果2true,执行循环体。

循环体执行完了,执行语句3

语句3执行完了又判断语句2,如果2true,又执行循环体。

依此循环,直到语句2false,循环结束。

 

案例一:编写程序,求出1+2+3+….+100的和

public class Test17{

     publicstatic void main(String[] args){

              int sum = 0;

              for(int i=1;i<=100;i++){

                       sum= sum+i;

              }

              System.out.println(sum);

     }

}

 

 

★  嵌套循环

案例一:编写程序,打印出九九乘法表

public class Test19{

         publicstatic void main(String[] args){

                  for(int i = 1;i<=9;i++){

                           for(intj = 1;j<=i;j++){

                                    System.out.print(j+"*"+i+"="+i*j+"");

                           }

                           System.out.println();

                  }

         }

}

 

五、          循环控制break、continue

break:可以在switch中使用,还可以用来结束循环

              案例一:

                           for(inti = 1;i<=5;i++){

                                    if(i==3){

                                             break;

                                    }

                                    System.out.print(i+” ”);

                           }

                  运行结果: 1 2

 

continue:结束当前这一次循环

案例二:

                           for(inti = 1;i<=5;i++){

                                    if(i==3){

                                             continue;

                                    }

                                    System.out.println(i+” ”);

                           }

运行结果: 1 2 4 5

 

案例三:Java中菜单跳转

import java.util.*;

public class Test19{

         publicstatic void main(String[] args){

                  boolean flag = true;

                  int i;

                  Scanner s = new Scanner(System.in);

                  while(flag){

                           System.out.println("1.取  款");

                           System.out.println("2.存  款");

                           System.out.println("3.查  询");

                           System.out.println("4.退  卡");

                           System.out.println("请选择你需要的操作:(1--4)");

                           i= s.nextInt();

                           switch(i){

                                    case 1:

                                             System.out.println("你选择了取款!");

                                             break;

                                    case 2:

                                             System.out.println("你选择了存款!");

                                             break;

                                    case 3:

                                             System.out.println("你选择了查询!");

                                             break;

                                    case 4:

                                             System.out.println("你选择了退卡!");

                                             flag= false;

                                             break;

                                    default:

                                             System.out.println("你输入有无,请重新输入!");

                           }

                  }

         }

}

 

六、          数组、一维数组

数组是所有编程语言中最常见的一种数据结构,他用于存储多个数据。

 

Java中数组要求数组中的元素类型要一致。Java中一旦数组初始化完成,数组在内存中所占用的空间被固定下来了,因此数组的长度不可变的。

 

★  数组的定义、初始化。

▼数组定义

           语法:

                         类型[] 数组名;//常用   int[] a;

                         类型数组名[];//不常用 int a[];

▼数组初始化

           ●静态初始化

初始化数组时由程序员显示的指定每个数组元素的值,不指定数组的长度,长度由系统自己计算。

                                             案例一:

                                                      int[]a;

a = new int[]{1,2,3};

                                             案例二:

                                                int[] a = new int[]{1,2,3};

                                                int[] a = {1,2,3};//简写  最常用

                                             案例三://错误的

                                                      int[]a;

                                                      a= {1,2,3};

 

           ●动态初始化

初始化数组时程序员只指定数组长度,不指定数组元素的值,系统自动给数组分配初始值。

                                   案例一:

                                                      int[]a;

                                                      a= new int[5];

 

                                             案例二:

                                                      int[]a = new int[5];

 

                  系统初始值:

                           byte、short、int、long ------->  0

                           float、double         ------->   0.0

                           char                 ------->   ‘\u0000’ 对应空

                           boolean              ------->   false

 

                           引用类型:数组、类、接口-----> null

 

★  访问数组元素

数组中每个元素都有一个下标,下标从0开始。

▼访问单个元素

int[]a = {56,78,23,50,95};

56  --------  a[0]

78  --------  a[1]

23  --------  a[2]

50  --------  a[3]

95  --------  a[4]

 

案例:

public class Test1{

     public staticvoid main(String[] args){

              int[] a = {56,78,23,50,95};

              System.out.println(a[0]);//56

              System.out.println(a[1]);//78

              System.out.println(a[4]);//95

     }

}

 

▼访问所有元素

要输出数组中所有元素,需要使用循环

案例:

public class Test1{

     public staticvoid main(String[] args){

              int[] a = {56,78,23,50,95};

              for(int i = 0;i<=4;i++){

                       System.out.println(a[i]);

              }

     }

}

 

说明:在做循环时,如果数组很长怎么办?怎么知道循环多少次? 在Java中数组有一个属性length,它记录了数组的长度。利用length就很方便.

int[] a = {56,78,23,50,95};

System.out.println(a.length);//5

 

输出数组所有元素一般按照下面方式:

public class Test1{

     public staticvoid main(String[] args){

              int[] a = {56,78,23,50,95};

              for(int i = 0;i<=a.length-1;i++){

                       System.out.println(a[i]);

              }

     }

}

 

补充:JDK5之后加入一个foreach循环,可以输出数组

public class Test1{

     public staticvoid main(String[] args){

              int[] a = {56,78,23,50,95};

                                    for(intb:a){//foreach循环

                       System.out.println(b);

              }

     }

}

 

★  数组应用

▼数组求和

          eg:有一组学生成绩如下:78,65,96,52,88  求出这组学生成绩的总分

public class Test{

       publicstatic void main(String[] args){

                int sum = 0;

                int[] a = {78,65,96,52,88};

                for(int i = 0;i<=a.length-1;i++){

                         sum= sum+a[i];

                }

                System.out.println("总分="+sum);

       }

}

▼数组求平均分

eg:有一组学生成绩如下:78,65,96,52,88  求出这组学生成绩的平均分

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                int sum = 0;

                double avg;

                //总分

                for(int i = 0;i<=a.length-1;i++){

                         sum= sum+a[i];

                }

                System.out.println("总分="+sum);

                //平均分

                avg = sum/(a.length*1.0);

                System.out.println("平均分="+avg);

       }

}

 

▼数组求最大、最小值

 

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                int max = a[0];//假设a[0]最大

                int min = a[0];//假设a[0]最小

                //求最大值、最小值

                for(int i = 0;i<=a.length-1;i++){

                         if(a[i]>max){

                                  max = a[i];

                         }

                         if(a[i]<min){

                                  min = a[i];

                         }

                }

                System.out.println("最高分="+max);

                System.out.println("最低分="+min);

       }

}

 

▼查找某个数据是否在数组中

eg:有一组学生成绩如下:78,65,96,52,88 从键盘输入一个分数,查找该数组是否在这组成绩中

import java.util.*;

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                boolean f = false;

                Scanner s = new Scanner(System.in);

                System.out.println("请输入你要查找的值:");

                int x = s.nextInt();

                //比较

                for(int i = 0;i<=a.length-1;i++){

                         if(a[i]==x){

                                  f = true;

                         }

                }

                //判断

                if(f){

                         System.out.println("找到了!");

                }else{

                         System.out.println("没有找到!");

                }

       }

}

 

▼分段统计

eg:有一组学生成绩:78,65,96,52,88 统计出及格人数和不及格人数

import java.util.*;

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                int count1=0,count2=0;

                for(int i = 0;i<=a.length-1;i++){

                         if(a[i]>=60){

                                  count1++;

                         }else{

                                  count2++;

                         }

                }

                System.out.println("及格人数="+count1);

                System.out.println("不及格人数="+count2);

       }

}

eg:有一组学生成绩:78,65,96,52,88 统计出不低于平均分人数,低于平均分人数

import java.util.*;

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                int count1=0,count2=0;

                int sum =0 ;

                double avg;

                //总分

                for(int i = 0;i<=a.length-1;i++){

                         sum= sum+a[i];

                }

                //平均分

                avg = sum/(a.length*1.0);

                System.out.println("总分="+sum+",平均分="+avg);

                //统计

                for(int i = 0;i<=a.length-1;i++){

                         if(a[i]>=avg){

                                  count1++;

                         }else{

                                  count2++;

                         }

                }

                System.out.println("不低于平均分人数="+count1);

                System.out.println("低于平均分人数="+count2);

       }

}

 

eg:有一组学生成绩如下:78,65,96,52,88 统计出90--100 80--89 60--79 0--59分各个分数段人数

import java.util.*;

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                intcount1=0,count2=0,count3=0,count4=0;

                //统计

                for(int i = 0;i<=a.length-1;i++){

                         if(a[i]>=90){

                                  count1++;

                         }elseif(a[i]>=80){

                                  count2++;

                         }elseif(a[i]>=60){

                                  count3++;

                         }else{

                                  count4++;  

                         }

                }

                System.out.println("90--100分人数="+count1);

                System.out.println("80--89 分人数="+count2);

                System.out.println("60--79 分人数="+count3);

                System.out.println(" 0--59 分人数="+count4);

       }

}

 

▼冒泡排序

eg:有一组学生成绩如下:89,75,64,32,78 将改组学生成绩从低到高排序

import java.util.*;

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                //冒泡排序(从小到大)

                for(int i = 0;i<a.length-1;i++){

                         for(intj = 0;j<a.length-1;j++){//此处可以优化 for(int j = 0;j<a.length-1-i;j++)

                                  if(a[j]>a[j+1]){

                                           inttemp = a[j];

                                           a[j]= a[j+1];

                                           a[j+1]= temp;

                                  }

                         }

                }

                //输出

                for(int i = 0;i<=a.length-1;i++){

                         System.out.print(a[i]+"  ");

                }

                System.out.println();

       }

}

 

eg:有一组学生成绩如下:89,75,64,32,78 将改组学生成绩从高到低排序

import java.util.*;

public class Test{

       publicstatic void main(String[] args){

                int[] a = {78,65,96,52,88};

                //冒泡排序(从大到小)

                for(int i = 0;i<a.length-1;i++){

                         for(intj = 0;j<a.length-1;j++){//此处可以优化 for(int j =0;j<a.length-1-i;j++)

                                  if(a[j]<a[j+1]){

                                           inttemp = a[j];

                                           a[j]= a[j+1];

                                           a[j+1]= temp;

                                  }

                         }

                }

                //输出

                for(int i = 0;i<=a.length-1;i++){

                         System.out.print(a[i]+"  ");

                }

                System.out.println();

       }

}

 

▼数组内存分析

:基本数据类型变量值,引用类型变量的地址值

:引用类型的真实值

案例一:

publicclass TestArray1{

public static void main(String[] args){

int[] a = {89,75,64,32,78};

System.out.println(a[3]);

}

}

案例二:

public class TestArray1{

         public static void main(String[] args){

                  int[]a = {89,75,64,32,78};

                  int[]b = {55,66,77,88};

                  System.out.println(a[2]);

                  System.out.println(b[2]);

         }

}

案例三:

public class TestArray1{

         public static void main(String[] args){

                  int[]a = {89,75,64,32,78};

                  int[]b = a;

                  System.out.println(a[3]);//32

                  System.out.println(b[3]);//32

                  a[1]= 100;

                  System.out.println(a[1]);//100

                  System.out.println(b[1]);//100

                  b[3]= 50;

                  System.out.println(a[3]);//50

                  System.out.println(b[3]);//50

         }

}

案例四:

publicclass TestArray1{

         public static void main(String[] args){

                  int[]a = {89,75,64,32,78};

                  int[]b = {55,66,77};

                  System.out.println(a[1]);//75

                  System.out.println(b[1]);//66

                  b= a;

                  System.out.println(a[1]);//75

                  System.out.println(b[1]);//75

                  b[1]= 30;

                  System.out.println(a[1]);//30

                  System.out.println(b[1]);//30

         }

}

 

七、          二维数组、多维数组

Java中没有多维数组。一维数组中放的是多个普通变量,二维数组中放的是多个一维数组,三维数组中放的是多个二维数组……

 

★二维数组

比叫下面案例:

public class Test{

       publicstatic void main(String[] args){

                int a = 10;//a普通变量

                int[] b = {1,2,3};//b一维数组

                                  // b[0] b[1]b[2]  一维数组中的元素(相当于a

                int[][] c ={{1,2,3},{7,8},{10,20,30}};// c二维数组

                                           //  c[0]  c[1]  c[2]               一维数组(相当于b

                                           // c[0][0]  c[1][1]c[2][2]    一维数组中的元素(相当于b[0]

                System.out.println(a);//10

                System.out.println(b[1]);//2

                System.out.println(c[2][1]);//20

       }

}

 

▼二维数组定义

语法:

           类型[][] 数组名;//常用   int[][] a;

           类型数组名[][];//不常用 int a[][];

▼数组初始化

●静态初始化

初始化数组时由程序员显示的指定每个数组元素的值,不指定数组的长度,长度由系统自己计算。

                                             案例一:

                                                      int[][]a;

a = new int[][]{{1,2,3},{5,6},{10,20,30}};

                                             案例二:

                                             int[][]a = new int[][]{{1,2,3},{5,6},{10,20,30}};                                                                                int[][] a ={{1,2,3},{5,6},{10,20,30}};//简写  最常用

                                             案例三://错误的

                                                      int[][]a;

                                                      a= {{1,2,3},{5,6},{10,20,30}};

 

●动态初始化

初始化数组时程序员只指定数组长度,不指定数组元素的值,系统自动给数组分配初始值。

                                   案例一:

                                                      int[][]a;

                                                      a= new int[3][2];

 

                                             案例二:

                                                      int[][]a = new int[3][2];

 

 

案例一:输出二维数组中的所有元素

public class Test{

       public static void main(String[] args){

                int[][]c = {{1,2,3},{7,8},{10,20,30,40}};// c二维数组

                                           // c[0]  c[1]   c[2]            一维数组

                                           // c[0][0]  c[1][1] c[2][2]    一维数组中的元素

                //输出了二维数组中所有一位数组

                for(inti = 0;i<=c.length-1;i++){

                         //输出一位数组c[i]的元素

                         for(int j = 0;j<=c[i].length-1;j++){

                                  System.out.print(c[i][j]+"  ");

                         }

                         System.out.println();

                }

                System.out.println();

       }

}

 

一.类和对象

◆思考:世界是由什么组成的?

         答:人、动物、植物……

 

         分类是人们认识事物的一个很自然的过程,在日常生活中人们会自觉或不自觉的对事物分类。

 

类:类是具有相同属性和行为的一组对象的集合与抽象。

(系统定义的类,用户自定义的类)

 

对象:对象是一个具体存在的实体,他是类的实例化,用来描述一个客观事物的实体,由一组属性和方法构造。(万物皆对象)

 

类与对象的关系:

类是对对象的描述,是创建对象的“模板”,是对象的抽象;对象是表示现实世界中某个具体的事物,是类的一个实例,是类的实例化结果。

二.类的定义

语法:

[修饰符] class 类名 [继承][接口]{

         0—n个属性;

         0---n个方法;

}

案例:

public class Box {

    //属性

    public int l;//

    public int w;//

    public int h;//

    //方法(求出体积)

    public void getV(){

       System.out.println("体积="+l*w*h); 

    }

    //方法(求出表面积)

    public void getS(){

       System.out.println("表面积="+2*(l*w+l*h+w*h));

    }

}

 

三.对象的创建

1.声明的对象

Box b;//int a;

Box b1,b2;//int a,b;

 

2.对象的创建

b = new Box();// a = 10;

b1 = new Box();

b2 = new Box();//a = 10,b=20;

 

注意:一般都是一二部一起完成

Box b = new Box();//int a = 10;

 

3.对象的使用

使用对象可以通过.来访问自己的属性和方法。

Eg:

b.l = 10;//访问属性

b.w = 5;

b.getV();//访问方法

 

综合案例:类和对象

public class Box {

    //属性

    public int l;//

    public int w;//

    public int h;//

    //方法(求出体积)

    public void getV(){

       System.out.println("体积="+l*w*h); 

    }

    //方法(求出表面积)

    public void getS(){

       System.out.println("表面积="+2*(l*w+l*h+w*h));

    }

    public static void main(String[] args){

       Box b = new Box();//创建一个对象

       b.l = 10;//给属性赋值

       b.w = 8;

       b.h = 5;

       b.getV();//调用方法

       b.getS();

    }

}

 

四.内存分析

案例一:

 

一、          方法的概念、作用

▼方法:

         方法类似于高中数学中的函数,它就是一段完成某种功能的代码的集合。

 

▼方法作用:

         简化代码,提高程序的可读性,有利于代码之间共享。

二、          方法的定义

★语法:

        [修饰符] 返回值类型方法名([参数列表]) [throws 例外1,例外2]{

                 方法体;

                 [return返回值;]

}

 

★说明:

        修饰符:publicstaticfinal……

 

        返回值类型:如果该方法有返回值,则标明返回值类型

                        如果该方法没有返回值,则使用void

 

        方法名:就是方法的名字(方法名是自己定义的,但是方法名不可以乱写,必须遵循:

1.      第一个字母小写

2.      如果使用多个单词,除第一个单词外其他单词第一个字母大写

3.      使用的单词最好能够明确表达出该方法的主要功能,不要怕方法名长eg:drawCircleAndRectangle())

 

参数列表:有的方法调用它时需要传入参数,此时就需要在方法列表中写好对应的参数列表,有的方法不需要传入参数就不需要参数列表。

 

throws 例外1,例外2:暂时不用考虑

 

         方法体:完成该方法功能的代码块,是方法中最重要的部分。

 

         return 返回值:如果前面返回值类型为void,则不需要返回值

                                      如果前面返回值类型不为void,则需要返回对应类型的参数

 

 

案例:

public class Fuction {

    //最简单的方法

    void fun1(){

       System.out.println("HelloWorld!");

    }

    //带修饰符的方法

    public void fun2(){

       System.out.println("你好!");

    }

    //带修饰符的方法

    public static void fun3(){

       System.out.println("大家好!");

    }

    //带参数的方法

    public void fun4(int x,int y){

       int sum = x+y;

       System.out.println(sum);

    }

    //带返回值的方法

    public int fun5(int x,int y){

       int sum = x+y;

       return sum;

    }

    //主方法

    public static void main(String[] args) {

       Fuction f = new Fuction();

       f.fun1();//调用方法

       f.fun2();

       f.fun3();

       f.fun4(10, 20);

       int x = f.fun5(20, 30);//调用有返回值的方法

       System.out.println(x);

    }

}

 

总结:方法有没有修饰符,有没有返回值,有没有参数……都是我们自己根据实际情况可以控制的,怎样简单就怎样写。

 

三、          方法的调用

★在面向过程的编程语言中(eg:C),程序是由一个一个的函数(方法)组成的,方法可以直接调用。

★在面向对象的编程语言中(eg:Java),程序是由一个一个的类组成的,方法不可以单独调用。一个方法必定属于一个类或者一个对象。调用方法时,必须使用类或者对象作为调用者,及必使用 “类.方法” 或者“对象.方法”。

 

★静态方法和普通方法:

▲如果方法前面加了修饰符“static”,代表该方法是静态方法,静态方法属于类。调用静态方法时可以使用类来调用,也可以使用对象来调用,如果前面没有指明调用则默认为当前类调用。

案例:

public class Test1 {

    public static void add(int a,int b){//静态方法  类方法

        int sum = a+b;

        System.out.println(sum);

    }

    public static void main(String[] args){

        Test1.add(10,20);//使用类名调用

        Test1 t = new Test1();

        t.add(20,30);//使用对象调用

        add(30,40);//没有指明调用者,默认为类调用 Test1.add(30,40);

    }

}

 

▲如果方法前面没有加修饰符“static”,代表该方法是普通方法,普通方法属于对象。在静态方法中调用普通方法只能使用对象调用;在普通方法中调用普通方法 可以使用对象调用,可以使用this调用,也可以直接调用(默认缺省this,this就是指的当前对象)。

案例:

public class Test1 {

    public void fun1(){

        System.out.println("Hello World!");

    }

    public void fun2(){

        Test1 t = new Test1();

        t.fun1();//对象调用方法

        this.fun1();//this调用

        fun1();//直接调用默认缺省this

        System.out.println("你好!");

    }

    public static void main(String[]args) {

        Test1 t1 = new Test1();

        t1.fun2();//对象调用

    }

}

 

★返回值

▲有的方法返回值类型为void,代表没有返回值,则直接调用即可。

▲有的方法返回值类型不为void,代表该方法有返回值,调用时需要定义相应类型变量接收返回值再输出,或者直接输出。

案例:

public class Test1 {

    public void fun1(int a,int b){

        int sum = a+b;

        System.out.println(sum);

    }

    public int fun2(int a,int b){

        int sum = a+b;

        return sum;

    }

    public static void main(String[]args) {

        Test1 t = new Test1();

        t.fun1(10,20);//调用没有返回值的方法   直接调用

        int x = t.fun2(20,30);//调用有返回值的方法  定义相应类型变量接收

        System.out.println(x);//输出接收的值

        System.out.println(t.fun2(20,30));//调用有返回值的方法  直接输出

    }

}

 

★参数列表

▲有的方法没有参数列表,则直接调用即可

▲有的方法有参数列表,则调用时需要传入相应类型的参数

public class Test1 {

    public void fun1(){

       System.out.println("Hello World!");

    }

    public void fun2(int a,int b){

       int sum = a+b;

       System.out.println(sum);

    }

    public static void main(String[]args) {

       Test1 t = new Test1();

       t.fun1();//调用没有参数列表的方法直接调用

       t.fun2(10,20);//调用有参数列表的方法需要传入相应类型的参数

    }

}

 

总结:

调用方法“三看”

一看 static

         :是静态方法 .方法 对象.方法 方法(默认缺省类名)

         没有:普通方法

                   1.静态方法中调   对象.方法

                   2.普通方法中调   对象.方法 this.方法   方法(默认缺省this)

 

二看返回值类型

         没有: 正常调用

         : 定义相应类型变量接收

                   直接输出

 

三看参数列表

         没有:正常调用

         有:传入相应类型变量

 

四、          方法的参数传递

在定义方法时,如果方法中有参数列表,则调用方法时需要传入相应类型的参数。

形参:(形式参数)定义方法时,方法参数列表中的参数

实参:(实际参数)调用方法时,传递给形参的值就是实参

 

    Eg

public class Test1 {

    public void fun1(int a,int b){//a,b是形参

       int sum = a+b;

       System.out.println(sum);

    }

    public static void main(String[]args) {

       Test1 t = new Test1();

       int x = 10;

       int y = 20;

       t.fun1(x,y);//x,y是实参

    }

}

 

Java中方法的参数传递方式只有一种:值传递(真实值、地址值)

所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到影响。

▲案例一:值传递真实值

public class Test1 {

    public static void fun1(int a){

       System.out.println("变化前a="+a);

       a = 200;

       System.out.println("变化后a="+a);

    }

    public static void main(String[]args) {

       int x = 100;

       System.out.println("变化前x="+x);

       fun1(x);

       System.out.println("变化后x="+x);

    }

}

运行结果:

变化前x=100

变化前a=100

变化后a=200

变化后x=100

 

五、          方法重载

思考如下代码

public class Test1 {

    public static void addTwoInt(int a,int b){

       System.out.println(a+b);

    }

    public static void addThreeInt(int a,int b,int c){

       System.out.println(a+b+c);

    }

    public static void addTwoDouble(double a,double b){

       System.out.println(a+b);

    }

    public static void addThreeDouble(double a,double b,double c){

       System.out.println(a+b+c);

    }

    public static void main(String[] args) {

       addTwoInt(10,20);

       addTwoDouble(10.5,9.6);

    }

}

该案例中有四个方法都是求和,但是方法名都不一样,我们在加法时,还需要去考虑调用那个方法,十分麻烦,而且容易出错。能不能让相同功能的方法名都一样呢?这里就需要用到重载。

 

Java中允许定义多个同名的方法,只需要这些方法参数列表不一样即可,这个就叫方法的重载。(参数列表不一样可以是:1.参数个数不一样 2.参数类型不一样 3.参数顺序不一样)

 

六、          构造方法的概念和作用

▼构造方法:

         构造方法是一个用来初始化一个对象的内部状态的特殊方法(给属性赋值)

         构造方法时创建对象的根本,创建对象其实都是使用new 构造方法() 来完成的。

 

▼语法

         [修饰符方法名([参数列表]){ //构造方法名必须和类名一致

                   //方法体

}

 

▼案例

没有自定义构造方法

自定义构造方法

七、          构造方法的特点

1.构造方法名必须和类名一致

public People(String name,char sex,int age){//构造方法名必须和类名一致

            this.name = name;

            this.sex = sex;

            this.age = age;

   }

2.构造方法没有返回值,也不能写void

 

3.构造方法不能被程序员显示的直接调用

public static void main(String[] args) {

            Peoplep = new People("李天鹏",'',17);

            p.tell();

            p.People("李天鹏",'',17);//报错

   }

4.Java语言中,每个类至少有一个构造方法。(如果没有构造方法,则不能创建对象)

 

5.如果类的定义者没有显示的定义任何构造方法,则Java编译器会自动为该类提供一个默认为空的构造方法。(没有参数列表,没有方法体)

        Eg:

                            public People(){

       

   }

 

6.如果类的定义者显示定义了一个或多个构造方法,则系统不再提供默认为空的构造方法。

public class People {

  public String name;

  public char sex;

  public int age;

  public People(String name,char sex,int age){

      this.name = name;

      this.sex = sex;

      this.age = age;

  }

  public void tell(){

      System.out.println("我叫:"+name+",性别:"+sex+",年龄:"+age);

  }

  public static void main(String[] args) {

      Peoplep = new People("李天鹏",'',17);

      p.tell();

      Peoplep = new People();//报错,程序员自己定义了一个构造方法,则系统不再提供为空的。

  }

}

 

八、          构造方法的重载

方法的重载就是在同一个类中允许同时存在一个以上的同名方法,只要它们的参数个数或者类型不同即可。在这种情况下,该方法就叫被重载了,这个过程称为方法的重载(overloading

Java编译器能根据调用方法时所传递的参数个数和类型选择相应的方法。

public class People {

     //属性

     public String name;

     public char sex;

     public int age;

     //构造方法重载

     public People(){

        

     }

     public People(String name,char sex){

         this.name = name;

         this.sex = sex;

     }

     public People(String name,char sex,int age){

         this.name = name;

         this.sex = sex;

         this.age = age;

     }

     //普通方法

     public void tell(){

         System.out.println("我叫:"+name+",性别:"+sex+",年龄:"+age);

     }

     public static void main(String[] args) {

         People p1 = new People("李天鹏",'',17);

         p1.tell();

        

         People p2 = new People("侯盼盼",'');

         p2.tell();

        

         People p3 = new People();

         p3.name = "秦斌";

         p3.sex = '';

         p3.age = 18;

         p3.tell();

     }

}

 

九、          构造方法的调用

在一个构造方法中调用另外一个构造方法,不是使用构造方法名,而是使用this(参数)的形式。

注意:

        在一个构造方法中调用另一个构造方法,this(参数)必须位于第一行。

        不能再够方法以为的任何地方调用构造方法

        在一个构造方法中最多只能使用一个this调用一个构造方法。

 

public class Student {

      public String no;//学号

      public String name;//姓名

      public char sex;//性别

      public int age;//年龄

      public String address;//籍贯

      //构造方法

      public Student(){

          

      }

      public Student(String no,String name,char sex,int age){

           this.no = no;

           this.name = name;

           this.sex = sex;

           this.age = age;

      }

      public Student(String no,String name,char sex,int age,String address){

           this(no,name,sex,age);//调用前面的构造方法publicStudent(String no,String name,char sex,int age){ }

           this.address = address;

      }

      //方法

      public void tell(){

           System.out.println("学号:"+no+",姓名:"+name+",性别:"+sex+",年龄:"+age+",籍贯:"+address);

      }

      public static void main(String[] args) {

           Student s1 = new Student("KF00125","侯盼盼",'',17,"河南新乡");

           s1.tell();

           Student s2 = new Student("KF00128","申金玉",'',16);

           s2.tell();

      }

}

 

在Java语言中,根据变量的位置的不同,可以将变量分为两大类:

                               成员变量                      局部变量

 

       Java中的内存空间:栈、堆、全局数据区、全局代码区

              :基本数据类型、引用类型的地址

                   :引用类型的真实值(数组的值、对象的属性)

                   全局数据区:类属性(加了static的属性)

                   全局代码区:所有的方法的代码

 

 

十、          成员变量

★在类的范围里面定义的变量就是成员变量(成员变量就是属性,也可以叫成员属性)

 

成员变量分为两类:

        ●类属性:   ●实例属性:

        在定义一个属性时如果使用static修饰,则就是类属性;如果没有使用static修饰,则就是实例属性(实例就是对象)

 

        类属性的作用域与这个类的生存范围相同,他作为一个类的成员,与类共存亡。只要类存在,程序就可以访问该类的类属性。访问类属性可以使用 .属性 也可以使用 对象.属性

        实例属性从这个类的实例(对象)被创建开始存在,直到系统完全销毁这个实例,它作为实例(对象)的一个成员,与实例(对象)共存亡。只要实例(对象)存在,程序就可以访问该实例的实例属性。访问实例属性可以使用 实例.属性

 

案例:

package test3_8;

public class Test {

     public int a;//实例属性

     public static int b;//类属性

     public void fun(){

         System.out.println("属性加了static就是类属性,没有static就是实例(对象)属性");

     }

     public static void main(String[] args) {

         Test t = new Test();

         t.a = 10;//访问实例属性

         t.b = 20;//访问类属性 

         Test.b = 30;//访问类属性

         System.out.println(t.a);

         System.out.println(t.b);

         System.out.println(Test.b);

     }

}

 

类属性和实例属性的区别:类属性保存在全局数据区,实例属性保存在堆中。

案例一:

public class People {

     //属性

     public String name;

     public char sex;

     public int age;

     public String address;

     //构造方法

     public People(String name,char sex,int age,String address){

         this.name = name;

         this.sex = sex;

         this.age = age;

         this.address = address;

     }

     public void tell(){

         System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",籍贯:"+address);

     }

     //主方法

     public static void main(String[] args) {

         People p1 = new People("陈浩然",'',16,"河南汴京");

         People p2 = new People("宗金原",'',17,"河南汴京");

         People p3 = new People("赵雪玲",'',17,"河南汴京");

         System.out.println("------改名前------");

         p1.tell();

         p2.tell();

         p3.tell();

         p1.address ="河南开封";

         p2.address ="河南开封";

         p3.address ="河南开封";

         System.out.println("------改名后------");

         p1.tell();

         p2.tell();

         p3.tell();

     }

}

运行结果

------改名前------

姓名:陈浩然,性别:男,年龄:16,籍贯:河南汴京

姓名:宗金原,性别:男,年龄:17,籍贯:河南汴京

姓名:赵雪玲,性别:女,年龄:17,籍贯:河南汴京

------改名后------

姓名:陈浩然,性别:男,年龄:16,籍贯:河南开封

姓名:宗金原,性别:男,年龄:17,籍贯:河南开封

姓名:赵雪玲,性别:女,年龄:17,籍贯:河南开封

 

内存分析

案例二:

public class People {

     //属性

     public String name;

     public char sex;

     public int age;

     public static String address;

     //构造方法

     public People(String name,char sex,int age,String address){

         this.name = name;

         this.sex = sex;

         this.age = age;

         this.address = address;

     }

     public void tell(){

         System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",籍贯:"+address);

     }

     //主方法

     public static void main(String[] args) {

         People p1 = new People("陈浩然",'',16,"河南汴京");

         People p2 = new People("宗金原",'',17,"河南汴京");

         People p3 = new People("赵雪玲",'',17,"河南汴京");

         System.out.println("------改名前------");

         p1.tell();

         p2.tell();

         p3.tell();

         People.address ="河南开封";

         System.out.println("------改名后------");

         p1.tell();

         p2.tell();

         p3.tell();

     }

}

运行结果

------改名前------

姓名:陈浩然,性别:男,年龄:16,籍贯:河南汴京

姓名:宗金原,性别:男,年龄:17,籍贯:河南汴京

姓名:赵雪玲,性别:女,年龄:17,籍贯:河南汴京

------改名后------

姓名:陈浩然,性别:男,年龄:16,籍贯:河南开封

姓名:宗金原,性别:男,年龄:17,籍贯:河南开封

姓名:赵雪玲,性别:女,年龄:17,籍贯:河南开封

内存分析

 

十一、   局部变量

★在方法的范围里面定义的变量就是局部变量

 

        局部变量分为三类:

            ●形参:整个方法中有效

●方法局部变量:在方法中,从定义开始到方法结束

●代码块局部变量:在代码块中,从定义开始到代码块结束

 

案例:

public class Test2 {

  public String name;//name成员变量   实例属性

  public static String address;//address成员变量  类属性     全局数据区

  public void fun(int a,int b){//a,b局部变量  形参

       int sum = a+b;//sum局部变量  方法局部变量

       for(int i = 1;i<=100;i++){//i局部变量  代码块局部变量

            System.out.println(i);

       }

    }

}

 

总结:局部变量与成员变量的区别

1.       定义变量的位置不同 局部变量在方法中 成员变量在类中

2.       保存变量的位置不同 局部变量在栈中 成员变量在堆和全局数据区中

3.       局部变量(除了形参)必须要初始化才能使用 成员变量可以不用初始化系统会提供默认值

 

相关文章

    暂无相关文章
相关栏目:

用户点评