java 学习笔记基础

来源:互联网 发布:硬盘数据恢复软件排名 编辑:程序博客网 时间:2024/05/20 07:17

序言

初学 java 时记录的笔记整理。

Java语言的三大特点

  1. 面向对象 两个基本概念:类与对象。 三大特性:封装性、继承性、多态性。
  2. 健壮性
    相对比其他的编程语言。比如去掉了指针与内存的申请与释放。
  3. 跨平台性 一次编译,到处运行。(前提是有JVM下)

关键字、标识符、命名规范

  • 关键字:严格区分大小写。所有关键字都是小写的。
  • 标识符:由数字、字母、_、$组成。是类名、变量名、方法名等的名字(凡是可以取名字的)。
    不能数字开头。不能有空格、不能使用关键字与保留字、严格区分大小写。
  • 命名规范(不是强制的)
    • 包名:由字母组成,都是小写的,比如school.test.uitl。
    • 类名:开头字母大写,所有单词的开头字母都是大写,比如WebService。
    • 变量名与方法名:开头字母小写,从第二个单词开始,首字母大写,比如startName,getName()
    • 常量名:所有字母大写,单词间使用_隔开,比如JAVA_NAME。

数据类型

  • 基本数据类型引用数据类型的区别(重点):
    类(class)、接口(interface)、数组、String,这些都是引用数据类型。
    基本数据类型的数值,直接保存在栈中。
    引用数据类型的数值,数据保存在堆中,在把该数据的内存地址引用给变量名使用。

  • 基本数据类型的转换:

    • 自动转换:容量小的类型自动转换为容量大的数据类型有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。当用+号连接字符串与基本数据类型时,自动转化为字符串。
    • 强制转换:通常发生在存储类型转换为存储类型(强制转换有精度损失)。
    • 进制的转换:
      • 十进制转换二进制:除2取余数,从后往前取如
        23,11101 → 10111
      • 二进制转换十进制:每位数乘2的幂数
        23=2ˇ4*1 + 2ˇ3*0 + 2ˇ2*1 + 2ˇ1*1 + 2ˇ0*1
        其他的进制了解即可。

运算符

  1. 算术运算符 值1%值2 计算时,结果不受值2是否正负影响,但是受值1影响。
    注意:如果负数进行取模,一定要加-号。如-123%2=-1 但被模数是负数,模数-号去掉。如123%-2=1
    如-123%-2=-1。

  2. 逻辑运算符
    &与&&区别:
    &不短路,无论如何都会执行右边的语句
    &&短路
    当左边true时,不短路,会执行右边的语句;
    当左边false时,短路,不执行右边语句

                int x=0;            boolean f1 = (12>35)&&(++x<2);            int y=0;            boolean f2 = (12>35)&(++y<2);            System.out.println(x);            System.out.println(y);

    ^(异或)与|(或)的不同:
    但两边都为true是为false

  3. 关系运算符
    ==、!=、<、>、<=、>=、instanceof
    忽略点:instanceof
    它是检查左边实例对象是否是右边类的实例,右边的操作数,必须是左边实例有继承关系()继承分支
    1.一个类的实例包括本身的实例,以及所有直接或间接子类的实例
    2.instanceof左边操作元显式声明的类型与右边操作元必须是同种类或有继承关系,
    即位于继承树的同一个分支上,否则会编译出错
    “Hello” instanceof String true
    “Hello” instanceof Object true

  4. 赋值运算符
    =、+=、-=、*=、/=、%=

  5. 三目运算符
    格式:
    (条件表达式) ? 表达式1 : 表达式2;

  6. 位运算符


循环结构

  1. for循环 格式:
    for (①初始化表达式; ②布尔值测试表达式; ③更改表达式){
    ④语句或语句块;

    执行顺序①②④③②。。。④③②。。④③②,直到循环结束

  2. while循环 格式
    [初始化语句]
    while(布尔值测试表达式){
    语句或语句块;
    [更改语句;]
    }

  3. do while循环 格式
    [初始化语句]
    do{
    语句或语句块;
    [更改语句;]
    }while(布尔值测试表达式);

  4. while与do while循环 的区别:
    do while 至少执行一次,才会退出循环

  5. 循环的流程控制

    1. break跳出循环(终止语句块的执行)。”可指明跳转那个循环语句块,不推荐使用,了解即可。”
    2. continue跳出本次循环,执行下次循环。”可指明跳转到那层循环语句体中,不推荐使用,了解即可。”
      注意:
      break 只能用于switch语句和循环语句中。
      continue 只能用于循环语句中。
      “标号语句”必须紧接在循环的头部。”标号语句”不能用在非循环语句的前面。
      break和continue之后不能有其他的语句,因为程序永远不会执行break 和 continue之后的语句。

数组

重点

数组型数据是对象(Object) 
数组是多个相同类型数据的集合,数组是引用类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
格式:
数据类型 var[] = new 数据类型[个数];

数据类型[] var = new 数据类型[个数]; (推荐使用这种,因为"数据类型[]"表示一组这种数据类型的集合,即数组)

Java语言中声明数组时不能指定其长度(数组中元素的数)

  • 例如: int a[5]; //非法
    下标从0开始,数组的下标范围是0~n-1。
  • 初始化:

    1. 静态初始化——定义时,就初始化,比如
      int[] a = new int[]{2,1,2,34,5,2};
    2. 动态初始化——在定义之后,给数组元素赋值,比如
          int[] b = new int[5];    for(int i=0;i<b.length;i++){        b[i]=i;    }
  • 二维数组:

    • 数据类型[][] 数组名 = new 数据类型[行长度][列长度];

          // 行长度不能为空,列长度可以为空                 int[][] t  = new int[4][];      //合法,有4行    int[][] t1 = new int[][4];      //非法
    • 重点: 二维数组的每个元素是一维数组

          int[][] d = new int[5][];    d[0] = new int[2];    d[1] = new int[4];    d[2] = new int[2];    d[3] = new int[5];
    • 引用数据类型

      • 引用数据类型的数据赋值给其他对象使用就是引用传递(地址的使用权给它使用,进行增删操作)。引用传递就是把堆内存空间的使用权交给多个栈内存空间。只要其中一个栈内存对堆内存数据更改了,则其他的栈内存使用的是同一个堆内存。所以达到一改全改的效果
      • 例子
            int[] a = new int[]{1,2,3,4,5,6};    int[] b = a;    b[0] = 0;    b[1] = 0;    b[2] = 0;    /** 分别输出a数组与b数组:        a数组000456        b数组000456      */
    • 分析:
      因为a、b数组引用的是同一个堆内存地址,所以不管a还是b更改了数组的数据。堆内存的数据都会改变
      引用数据类型都特点都这样。

对象

  • 重点:

    • 属于引用数据类型。
      public 
      可以在所有类中访问。
      private
      只能由该类的范围(类的{}之间)访问。
      protected
      只能在本包和不同包的子类之中访问。

      如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。
  • 类的访问机制
    - 在本类中的访问机制:类中的方法可以直接访问类中的成员变量。(有一个例外…但是不知道是那个例外)
    - 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。

  • 对象的生命周期

            // 当一个对象的为null时,无法访问(死亡),        // jvm视为垃圾,等待回收。        Person p = new Person();        p=null;     //成为垃圾,可以使用这种方法控制jvm回收机制        // 当对象出了作用域时,无法访问(死亡),        // jvm视为垃圾,等待回收。        // 出了{}范围,成为垃圾        {            Person p = new Person();        }        // 实例的对象没有被引用时,执行完,        // 无法访问(死亡),jvm视为垃圾,等待回收。        Person p1 = new Person();        Person p2 = p1;        p2=null;        // Person对象没有视为垃圾,        // 因为Person对象的引用权给了2个栈内存使用,        // 其中一个放弃(p2赋值为null),但是还有一个(p1)还在引用 
  • 匿名对象
    - 没有被引用的对象。
    - 通常:我们只调用一次(成员变量或者方法),推荐使用匿名对象
    - 我们经常将匿名对象作为实参传递给一个函数调用。

  • 利用面向对象的编程思想,设计类Circle计算圆的面积:

    // ①    public class Circle{        //半径        int radius = 0;        //返回圆的面积        public double findArea(){            return 3.14*radius*radius;        }    }    // ②    public class Circle{        //返回圆的面积        public double findArea(int radius){            return 3.14*radius*radius;        }    }    /**      * ①体现了面向对象的编程思想,因为圆本身具有半径,具有面积。     * ②破坏了面向对象的编程思想。难道一个园没有半径吗?只有面积吗?     *  明显园本身就具有半径这个属性和面积。     */
  • 信息的封装和隐藏(private)

    • 使用者对类内部定义的属性(对象的成员变量)
    • 的直接操作会导致数据的错误、混乱或安全性问题。
    • 封装隐藏目的:
      • 隐藏一个类的实现细节;
      • 使用者只能通过事先定制好的方法来访问数据(我没有对外提供相应的的方法就不能访问类中的成员),
      • 可以方便地加入控制逻辑,限制对属性的不合理操作;
      • 便于修改,增强代码的可维护性。
  • 构造方法
    Java语言中,每个类都至少有一个构造方法;

    • 特点:
      1. 构造器的名称必须与类名相同。修饰符:public、private、protected
      2. 构造器不是方法,没有返回值(连void也不能写)
      3. 构造器不能被继承
    • Java类中,一旦类的定义者显式定义了一个或多个构造方法,系统将不再提供默认的构造方法。
    • 主要作用:
      利用构造器参数初始化对象的属性。
      内存状态变化过程分析:

      Person p = new Person("Tom",18);①实例化对象,堆内存中name=null;age=null;②堆内存中name="unknown";age=-1;③堆内存中name="Tom";age=18;④把堆内存空间的使用权的引用给p;
0 0