java入门学习笔记

当前保持更新和修改,欢迎在评论区指正和添加重点 

  • java的发展简史

   Java之父:詹姆斯高斯林  sun公司

   1991年  java问世

   2004年  jdk1.5更名jdk5.0

   2010年  sun公司被Oracle公司收购了

一、java中常见的几个名词
   JDK: java development kit            java开发工具
  JRE: java  runtime  environment    java运行环境
  JVM: java virtual machine              java  虚拟机
  GC: garbage connection             垃圾回收器
 

二、java的特点
   1、跨平台,移植性好(虚拟机)
   2、简单易学(面向对象)
   3、安全性较高
   4、可扩展性
   5、动态性等

三、标识符的命名规范
   1、只能由数字、字母、下划线及$符组成
   2、不能以数字开头
   3、不能是保留字关键字
   4、区分大小写
   5、支持中文,但不推荐 
     
    程序员之间墨守成规的编码规范
    1、见名知意
    2、遵循驼峰命名法(第一个单词首字母小写,后面每个单词首字母都大写:helloWorld)
    3、命名长度不宜过长,一般不超过三个单词
    
四、java中的注释
    1、 //表示单行注释
    2、/*内容*/多行注释
    3、/**内容*/文档注释

    
五、变量
   定义:可变得量 
   变量的声明 1、 int a ; a = 5;
                      2、 int a = 5;
                            必须初始化;
    同一个main方法中变量名不能重复
    
六、8种基本数据类型和引用数据类型(待完善)
 
基本数据类型
    字节第一位为符号位  0代表正数、1代表负数
    一个字节  八位  取值范围为:-128~127 
    1、整型数据(整数类型默认为int型) 
    byte : 1字节   8位    取值范围:-128~127
    short:2字节   16位   取值范围:-2^15~2^15-1
    int  : 4字节   32位   取值范围:-2^31~2^31-1
    long : 8字节   64位   取值范围:-2^63~2^63-1
    备注:byte,short取值若超过自身范围会自动转成int型
             若表示long类型数据,要在数值后面加上l或L
          
    2、浮点型
    float: 4字节   32位  表示float类型需要在数值后面加上F或f
    double 8字节   64位
    默认类型为double类型
    
    3、字符型
    char:  2字节   16位
      3.1、没有符号位   取值范围:0~2^16-1
      3.2、java中字符表现形式为单引号‘内容’,且内容只能为单个字符,可以为中文。
      3.3、可以当整数来用(对照ASCII表 A:65 a:97)
      3.4、字符类型参与算数运算会自动转换为int类型
    4、布尔类型
    boolean 1字节 只有true,false

 

备注:byte/short/char/这三种类型在运算时,
         都会被首先提升为int型(就算两个是两个byte运算也是先被提升为in)然后再计算
    
  引用数据类型
  String类  为字符串类,在java中一切以双引号引起来的称为字符串。
    1.String  str = "123";
    2.String  st = new String("123");
    
    
七、基本数据类型之间的相互转换
   1、取值范围从小到大实现自动转换
    byte->short(char)->int->long->float->double 
             char->(参与算数运算自动转换成int类型)

●经典问题:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?
答:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型  转换错误。对于short s1=1;s1+=1来说 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

   2、取值范围从大到小需要强制转换
       强制转换符:()
       整型强转可能会导致数据溢出,浮点型强转会导致精度丢失

八、java中的运算符
    算数运算符、关系运算符、条件运算符、逻辑运算符、按位运算符、赋值运算符    
    
    算术运算符: + - * / % ++ --
             +:既可以做加法操作,也可做拼接操作
                当+两边为数值类型的时候是加法操作,
                当有一边为字符串的时候做拼接操作(*拼接后自动转为字符串类型)
                (运算顺序从左到右)
             /: 取整操作  (表示浮点类型则需至少一个数为浮点型)
             %:取余操作
             ++:自增运算符 分前++与后++ 例:++i与i++;
                ++i:先自身加一再参与运算
                i++:先参与运算再自增
            --:自减运算符规则与自增类似
            扩展运算符:+= -= *= /= %=  用法以+=为例:i += 1; 等价于 i = i + 1;
                  
    关系运算符:>  <  >=  <= !=(不等于)  ==(恒等于 注: '=' 为赋值运算符) 
               == 比较的不是两边的值是否相等,而是比较两边数值存储在计算机内存的地址值是否相等
               当==两边为基本数据类型时可以当做值来比较,因为基本数据类型数据在计算机内存中具有数据共享性
               String s1 = "123";//直接让创建的对象先存储在字符串常量池中,然后赋值给引用是s1
               String s2 = "123";//先从字符串常量池遍历是否有"123"存在,有赋值给引用s4,没有则重新创建对象放入常量池
            
    条件运算符(三目运算符):语法: 布尔表达式 ? 值1 :值2; 
                            布尔表达式为ture运算结果为值1,反之为值2 例:3 > 4 ? 1 : 2; 结果为2    
     
    逻辑运算符:逻辑与 &&   逻辑或 ||   非 !  
                逻辑与存在短路功能(只要有一个表达式为false,则后面的不参与运算)
                逻辑或存在短路功能(只要有一个表达式为true,则后面的不参与运算)
    
    按位运算符:按位与 &  按位或 |  
                作用:1、可以当做算数运算   算数运算:  5 & 2:   0101                 5 | 2:   0101                                         
                           2、关系运算 : 运算规则与逻辑运算一样         0010                               0010
                                没有短路功能!与逻辑运算不一样            ———                           ———
                                                                                                   0000   结果为:0            0111   结果为:7
                                                                 
    移位运算符:>>  <<  移位运算符操作的对象是二进制的位
                >>:左移运算符,将运算符左边的对象向左移动运算符右边指定位数(在低位补0)
                <<:右移运算符,将运算符左边的对象向右移动运算符右边指定位数,如果值为正,则在高位补0,负则补1

九、数据结构
    顺序结构  分支结构  循环结构

    顺序结构:按顺序一步一步执行称为顺序结构,如main()方法

    分支结构:单分支 多分支    
              单分支:  if (布尔表达式){语句块};                  布尔表达式为真执行语句块假则不执行
                        if(布尔表达式){语句块一};else{语句块二};  布尔表达式为真执行语句块一假则执行语句块二
    
              多分支: if(布尔表达式){语句块1}; else if(布尔表达式){语句块2}; else {语句块3};
                       哪个布尔表达式为正则执行哪个语句块
                       
                       switch case语法:    switch(key) {
                                                    case k1:{语句块};
                                                       break;
                                                       ...
                                                  case k8: {语句块};
                                                        break;
                                                  default:{语句块}   
                                                        break;                                                  
                                                 }
                        备注:key的类型在JDK1.7之前只支持整数类型和枚举,JDK1.7之后还支持String类型
                        switch case 中break关键字在这里的作用是防止case 渗透如果没有case中没有break
                        程序会自动往下执行,知道跳出switch case
                        
                        default:当所有case 都不执行时执行default,default也可以省略;
                        
              循环结构:while  do while  for
              
                       while语法:
                       while(布尔表达式)  //布尔表达式为true时执行循环体内容,直到false时终止循环
                       {
                        循环体内容       //包含退出循环的条件
                       }
    
                       do while 语法:
                       do{
                         循环体内容
                       }while(布尔表达式);  //先执行后判断,布尔表达式为真继续执行,为假则跳出
                         注:与while的区别是至少执行一次
               
                      for(表达式一;表达式二;表达式三) //表达式一:声明初始化变量(只执行一次)
                      {                                 //表达式二:判断是否循环的条件
                         循环体内容                     //表达式三:控制循环次数条件
                      }
                      for循环特点:表达式一可以写在循环外:变量变成全局变量
                                   表达式一、二、三也可不写,但容易进入死循环
                                   
                                   
    随机数:Math    Random
                        
           Math:数学中的理论
           生成随机数的方法:Manh,random();生成【0.0~1.0)的随机数(左闭右开)
           注意:默认double类型,得到int型需要强制转换。
           使用数据类型强制转换和数学操作可以得到我们想要的随机数区间(默认还是左闭右开)
                        
            Random :官方提供的类,要写包,使用必须“new”(Random randon) = new Random();)
            生成随机数的方法: 
            randon.nextInt();        //生成int取值范围内的任意一个整数(左闭右开)
            randon.nextInt(int i);   //生成0~i之间的任意一哥整数(左闭右开            )
                            
    循环中的两个关键字:  break   continue                
                      break:跳出循环的作用 
                                   
                      continue:跳过当次循环(如果执行到continue语句,则continue后面的语句不执行),继续执行下一次循环
                                  
    循环的嵌套:    备注:在以后的循环嵌套使用时for() 循环尽量使用两层嵌套,其余尽量少使用或不用                           
                    for(表达式;表达式2;表达式3)
                        {
                          for(表达式4;表达式5;表达式6)
                          {
                          循环体内容;
                          }
                        }                    
                                   
                    总循环次数等于:外层循环次数 * 里层循环次数        

十、数组

    备注:数组也属于引用数据类型
    定义:将具有相同数据类型的数据集中在一个容器中,称为数组                    
    数组的声明:
        1、数据类型[] 数组名 = new 数据类型[数组的长度];
           例: int[] arr = new int[3];   //声明一个长度为3的int类型数组
        2、数据类型[] 数组名 = {};        //声明一个空数组           
           例:int[] arr = {1,2,3};
        3、数据类型[]  数组名 = new 数据类型[]{}; //中括号不能指定长度
            例: int[]  arr = new int[]{1,2};    
        
        []位置可以在数据类型后面,也可以在数组名后面 

    数组的操作:
        1、通过下标来操作数组,下标从0开始,arr[0]是数组的第一个元素;
        2、用length来获取数组的长度
     
    数组中的默认值:
    整型:0
    浮点类型:0.0
    字符类型:\u0000
    布尔类型:false
    String:   null
    
    数组中的注意事项
    数组的长度大小一旦确定将不能发生改变,通过数组的扩容缩容可改变,但是地址会发生改变
    只是将新的地址值赋值给了原数组的引用。
    
    数组的扩容,缩容
    Arrays.copyOf(arr,newlength) newlength为arr.length加减数字
    arr:你扩容或缩容的对应数组
    newlength:扩容或缩容后新数组的长度
    备注: newlength 往往我们以原数组为基准,扩容后就用arr.length +扩容长度(缩容同理)
     不管是扩容还是缩容都是对原数组的最后一个元素进行操作
    输出数组: System.out.println(Arrays.toString(arr));     
    
    数组的复制:
    System.arraycopy(src,srcIndex,des,desIndex,length)
    src:原数组
    srcIndex:从原数组的哪个位置开始复制
    des:目标数组
    desIndex:从目标数组哪个地方开始插入
    length:插入长度或复制元素的个数
    备注:复制时,复制的元素个数不能超过目标数组的长度
                                   
    掌握几种排序的算法
     冒泡排序法,选择排序法,插入排序法

十一、方法
      方法的定义:能够实现某种特定功能的代码块
      语法:权限修饰符  返回值类型 方法名(参数列表){
             方法体                                       
      }
      权限修饰符:(前期)public static
      返回值类型:1.有返回值,返回值的相应类型
                  2.没有返回值-->void表示
      方法名:标识符,遵循驼峰命名法
      参数列表:由0到多个数据类型加变量组成,多个参数之间用逗号隔开
      方法体:实现具体业务逻辑代码
      例:public static int sum(int a,int b){
           int sum = a + b;
           return sum;
      }
       retur  关键字的作用  1.将方法中的运算结果返回给调用该方法的变量
                            2.结束方法的调用
      备注:方法里面不能嵌套方法!!不过可以调用。  
    
      方法的重载:overload
      方法名相同,参数个数不同或参数类型不同称为方法的重载(返回值不同没有用)

十二、面向对象   
 
      面向过程:凡事都得亲力亲为
      面向对象:不是所有的事情都自己做
      面向对象由类、引用、对象构成  面向对象就是针对类而言的
      类:描述事物的一个抽象概念
      引用:用来操作类创建的对象
      对象:类的实例化个体
      类  引用 = new 类();  Scanner类 Random类都是面向对象的思想

          
      成员变量:有默认值,与数据类型在数组中的默认值一样     
      成员变量:声明在类下面,方法外的变量   作用域:整个类
      局部变量:方法里面声明的变量     作用域:当前方法内
      区别:1、定义位置上的区别 
                 2、作用域的区别
                 3、默认值的不同
                 4、内存位置不同
                       成员变量,跟随对象进入堆内存存储
                       局部变量,跟随自己的方法,进入栈内存
                5、生命周期不同
                      成员变量,跟随对象,字堆中存储,内存等待JVM清理,生命相对较长
                      局部变量,跟随方法,方法出栈 生命相对较短
            
      ●构造函数
       无参构造函数   有参构造函数  (构造函数的重载)
       无参构造函数(默认)语法:
         public 类名(){
           语句块
         }
        有参构造函数语法:
        public 类名(参数列表){
            语句块
        }
        备注:和普通方法的区别?
              没有static没有返回值类型也没有void,且方法名必须与类名一致。
        构造函数的作用:方便成员变量进行初始化操作,
        备注:若没写构造函数,系统默认无参构造函数,若写了有参函数,系统将不再默认添加无参构造函数     
         
      ●气球理论
        如果多个引用同时指向同一个对象的时候,若其中一个引用对对象做了操作,那么其他引用也会随之发生变化  

    一、java中的继承
        类与类之间的继承  用关键字extends  例: public 继承类 extends 被继承类
        继承的特点:
        1、继承父类拥有的非私有的成员变量和成员方法
        2、子类可以拥有自己的成员变量和成员方法
        3、如果子类重写了父类的方法,则执行方法的时候,执行的是重写后的成员方法
        4、类与类之间只能单继承,子类只能一个父类,父类可以多个子类
        5、类可以多重继承
      
      继承的由来:将多个类中共同的内容放在一个类中,然后其他类则不必重复定义所需内容,简化程序
      继承的好处:1、让类与类之间产生了关联,为多态提供了前提条件
                  2、提高了代码的复用性
      继承的弊端:违背了软件工程的理念:低耦合,高内聚
      构造函数并不能被继承
      
    二、super关键字
        子类调用父类相关的构造函数,如果子类中不写super那么系统会默认添加super()该方法(不管有参还是无参)
        super()会会去找父类中的无参函数;
        super关键字在使用时必须在构造函数的首行,当与this()关键字冲突时可以不写super()关键字,系统会默认解决
        用this()调用自身构造函数时,会间接调用父类的构造方法
        
        this关键字
       this关键字代表本类对象的一个引用,谁调用this所在的方法,this就代表谁  
       this的使用场景
        A:用于区分同名成员变量和局部变量;
        B:在定义函数时,该函数内部要用到调用该函数的对象时,因为此时对象还没建立,故this代表此对象
        B:构造函数间调用
            **这个时候,this(参数)必须作为第一条语句存在。

        this和super之间的区别?
         调用本类和父类

    三、static关键字
        1、static修饰成员变量,将成员变量变为静态变量(类变量),可以直接用类名.变量名访问.而成员变量必须通过创建对象用引用访问
        2、static修饰成员方法,此时成员方法称为静态方法(类方法),可以直接使用类名.方法名()访问,而成员方法必须通过创建对象的引用访问        
        备注:静态方法只能访问静态变量,不能访问成员变量 
        3、static修饰代码块 语法:  static{
                                            代码块  
                                              }
             备注:静态代码块,执行优先级最高,在类加载的时候就已经执行了且只执行一次,通常用来加载视频图片等
                   
                   构造代码块:只有在main方法中创建对象的时候才能被访问,且可以被访问多次,优先级小于main方法
                   语法:
                   {
                   代码块
                   }
            思考:静态方法能不能被继承?答:可以被继承,但不能被重写
                
      ●权限修饰符
        public      公共的
        protected   受保护的
        默认
        private     私有的
        作用域范围:
                     本类    子类       同一个包中的类      其他类(和前面几个类不在同一个包中)
        public       √        √                √              √
        protected    √        √                √              ×
        默认         √        ×                √              ×
        private      √        ×                ×              ×

    四、封装 (方法,类,包装属于封装的一种)
        java中的核心思想中封装
        封装的好处
        1、提高代码的复用性
        2、隐藏实现细节,对外提供访问的方式
        3、提高了安全性
    
    五、java中的计算机存储内存    
    栈:存放的是基本数据类型对象和引用数据类型的引用
    堆:一切new 出来的对象
    方法区:存储静态变量和静态方法以及class文件
        
           
    六、多态
         同一事物在不同情况下显示出的不同的状态    例如:水
         java中:同一个对象在不同的环境下显示出不同的身份、
         实现多态的前提条件:1、必须有继承
                             2、有方法的重写
                             3、必须是父类的引用指向子类的对象
     
       多态的特点:                     
                  多态在执行的时候分为两个时期
                编译期   运行期
                父类 引用 = 子类对象;
        成员变量:编译期看类型,运行期看也看类型
        成员方法:编译期看类型,运行期看对象
        多态的局限性:只能够访问父类成员变量和成员方法,不能访问子类自身里面的成员变量和成员方法
        
        /*
        父类 Father  子类 Son
        //向上造型
        Father father = new Son();  //father引用  new了Son对象
        //向下造型
        Son son = (Son) father;    //将father强转为Son类型
        
        //备注:向下造型的时候需要注意转换的类型是否是需要的类型,可能会导致类型转换异常
        //可以通过instanceof关键字来避免类型转换异常
        //boolean b = 对象 instanceof 数据类型;
        */
        
    七、final关键字
       1、final修饰成员变量时,此时变量变为常量
       2、final修饰成员方法时,该方法不能被重写
       3、final修饰类时,该类不能被继承
        
    八、抽象类抽象方法
        关键字:abstract    
        在一个父类中,封装了子类都共同有的方法,但是方法体内容无意义,因为子类都会去重写父类中的方法,
        此时不写方法体,能够简化我们的代码,这里不写方法体的方法称为抽象方法,有抽象方法的类我们称为抽象类。
        
        抽象方法的语法: 权限修饰符 abstract void 方法名();  //么得方法主体
        
        抽象类的特点:
                    1、抽象类不能创建对象(不能new)
                    2、有抽象方法的类一定是抽象类
                    3、抽象类中可以没有抽象方法
                    4、子类继承抽象类,如果有抽象方法一定要实现(重写)全部抽象方法,
                       如果子类也是抽象类,可以不重写父类的抽象方法
        
        abstract和哪些关键字不能共存:
        final: final修饰的方法不能重写
        static:static修饰的方法可以直接通过类名访问,而抽象方法没有方法体,调用无意义
        private:private修饰的变量只能自己本类访问 ,但抽象类不能创建对象
        
    九、接口
          关键字:interface
          类语法: public interface 类名
          接口是一个特殊的抽象类。
      特殊性:1、接口中没有变量,有的只是常量                 (默认修饰符 public final)
              2、接口中的所有方法都是抽象方法,不能有成员方法 (默认修饰符 public abstract)
              3、接口没有构造函数
              4、接口不能创建对象
              5、接口可以多实现和多继承    //继承和实现多个类的时候用逗号隔开
              
        接口实现语法
        用关键字implements    public class 类名 implements 接口类名
              
         接口的特点:
        A:是对外暴露的规则
        B:是功能的扩展
        C:接口的出现降低耦合性。
            耦合(类与类之间的关系)
            内聚(类完成功能的能力)
            编程规范:低耦合,高内聚。
        D:接口可以多实现。如:CPU和主板、笔记本的USB插口、插座
        
        接口和抽象类的区别:
        A:抽象类只能被单继承
           接口可以多实现,接口的出现避免了多继承的局限性。
        B:抽象类中的数据特点:
                成员变量:可以是变量,也可以是常量
                成员方法:可以是抽象方法,也可以是非抽象方法
                构造方法:有构造方法
           接口中的数据特点:
                成员变量:是常量。默认修饰 public static final
                成员方法:都是抽象方法。都有默认修饰 public abstract
                构造方法:没有构造方法
        C:抽象类中定义的是继承体系中的共性功能。
           接口中定义的是继承体系中的扩展功能。
        D:抽象类被继承是"is a"关系:xx是yy的一种
           接口被实现是"like a"关系:xx像yy的一种
                                   
    十、单例模式(singleton)
         什么是单例模式?  一个类只能有一个对象
         如何使一个类只能拥有一个对象?
         用private修饰符修饰构造函数即可
         { 
           //保存本类的唯一实例
           private static 类名 引用 = null;
           //构造函数私有化
           //获取类的唯一实例的方法
          public static 数据类型(此处返回类的对象,所以类型为本类)  方法名(){

          }
         }
         
         java中单例模式有三种
         1、懒汉式 需要用到的时候才创建对象
         2、饿汉式 当类加载的时候,就创建对象
         3、登记式(不常用)
         
    十一、Object
        如果一个类没有去继承某个类的时候,默认继承Object类    
        Object类中的几个常用方法
        1、toString(); 返回该对象的字符串表示方式
        2、hashCode(); 返回该对象的哈希码值
        3、equals();指示其他对象是否与此对象:"相等"。
        如果要比较两个对象是否相等,先需要重写hashCode()方法,然后再去重写equals()方法
        才能保证对象相等。
        为什么重写equals()方法必须要重写hashCode()方法?
        保证地址值相等!
        
    十二、内部类
          匿名内部类
          为什么要有匿名内部类?
          如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或
          者继承某个类),而且对象创建后,这个类的价值也就不存在了,
          这个类可以不必命名,称之为匿名内部类。
   
          实现匿名内部类的前提条件: 通常这个类需要实现某个接口或者继承某个类

         格式:
            new 父类名或者接口名()
            {
                重写父类方法或者实现接口中的方法。
                也可以自定义其他方法。
            };

          什么时候定义匿名内部类?
          匿名内部类只是为了简化书写,匿名内部类有局限,
          通常定义匿名内部类时,该类方法不超过3个
           匿名内部类的好处和弊端:
            好处:简化代码书写
            弊端:
                不能直接调用自己的特有方法
                不能执行强转换动作
                如果该类里面方法较多,不允许使用匿名内部类

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值