java基础

java基础学习

标识符和关键字

  1. 标识符

    • 所有的标识符都应该由字母(a-z或者A-Z),美元符($),或者下划线(_)开始
    • 首字符之后可以是字母(a-z或者A-Z),美元符($),或者下划线(_)、数字任意字符组合
    • 不能使用关键字作为变量名或方法名
    • 标识符是大小写敏感的
    • 合法标识符举例:age、$salary、_value、__1_value
    • 非法标识符举例:123abc、-salary、#abc
    • 可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音
  2. 关键字

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tx5E9QCX-1615893238410)(C:\Users\lichaowen\AppData\Roaming\Typora\typora-user-images\image-20210313071044290.png)]

数据类型

  1. 强类型语言

    要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用

  2. 弱类型语言

    JavaScript

  3. Java的数据类型分为两大类

    • 基本类型(primitive type)

      1. 数值类型

        ​ 整数类型

        • byte占1个字节范围(-128-127)

        • short占2个字节范围(-32768-32767)

        • int占4个字节范围(-2147483648-2147483648)

        • long占8个字节范围(long类型要在数字后面加个L)

          long num = 30L;
          
          public class Demo{
              public static void main(String[] args){
                  //整数拓展:	进制	二进制0b	十进制
                  //八进制0	十六进制0x
                  int i = 10;//10(十进制)
                  int i2 = 010;//8(八进制)
                  int i3 = 0x10;//16(十六进制)
                  
                  System.out.println(i)
                  System.out.println(i2)
                  System.out.println(i3);
              }
          }
          

          浮点类型

        • float类型(float占4个字节,double占8个字节)

          //float类型要在数字后面加个F
          float num = 50.1F
          double num = 3.141582653589793238462643
          
          //浮点数拓展?银行业务怎么表示?钱
          //float	有限	离散	舍入误差 大约	接近但不等于
          //double
          //最好完全使用浮点数来进行比较
          float f = 0.1f;	//0.1
          double d = 1.0/10;	//0.1
          System.out.println(f==d);	//false
          
          float d1 = 44444444845555555555555;
          float d2 = d1 + 1;
          System.out.println(d1==d2);	//true
          
        • 字符类型char占2个字节

          //字符拓展
          char c1 = 'a';
          char c2 = '中';
          
          System.out.println(c1);	//a
          System.out.println((int)c1);//强制转换(97)
          System.out.println(c2);	//中
          System.out.println((int)c2);//强制转换(20013)
          //所有的字符本质还是数字
          //编码	Unicode 表:97 = a	2字节	65536	Excel 2 16
          
          //转义字符
          //\t	制表符
          //\n	换行
          
          
          //对象 从内存中分析
          String sa = new String("hello world");
          String sb = new String("hello world");
          System.out.println(sa==sb);	//false
          
          String sc = "helloworld";
          String sd = "helloworld";
          System.out.println(sc=sd);	//true
          
      2. Boolean类型

        占1位,其值是有true和false两个

        //布尔值拓展
        boolean flag = true;
        if(flag){}	//老手
        if(flag==true){}	//新手
        
    • 引用类型(reference type)

      1. 接口
      2. 数组
  4. 补充(什么是字节)

    • 位(bit):是计算机内部数据存储的最小单位,11001100是一个八位二进制数
    • 字节(byte):是计算机数据处理的基本单位,习惯上用大写B来表示
    • 1B(byte,字节)= 8bit(位)
    • 字符:是指计算机中使用的字母、数字、字和符号
      • 1bit表示1位
      • 1Byte表示一个字节1B=8b
      • 1024B=1kb
      • 1024KB=1M
      • 1024M=1G

  1. 类型转换

    • 由于java是强类型语言,所以要进行有些运算的时候需要用到类型转换

      --------------------------------->byte,short,char->int->long->float->double
      
      int i = 128;
      byte b = (byte)i;	//内存溢出
      double d = i;
      
      //强制转换(类型)变量名 高-->低
      //自动转化		低-->高
      
      System.out.println(i);	//128
      System.out.println(b);	//-128
      System.out.println(d);	//128.0
      
      /*
      注意点:
      1.不能对布尔值进行转换
      2.不能把对象类型转换为不相干的类型
      3.再把高容量转换到低容量的时候,强制转换
      4.转的时候可能存在内存溢出,或者精度问题
      */
      
      //JDK7新特性,数字之间可以用下划线分割
      int money = 10_0000_0000;
      int years = 20;
      int total = money*years;//计算的时候溢出
      long total2 = money*years;//默认是int,转换前已存在问题
      long total3 = money*(long(years));//2000000000
      
      System.out.print(money);	//1000000000
      
      
    • 运算中,不同类型的数据先转化为同一类型,然后进行运算

    • 强制类型转换

    • 自动类型转换

变量

  1. 变量是什么:就是可以变化的量!

  2. java是一种强类型语言,每个变量都必须声明其类型

    //int a,b,c;
    //int a=1,b=2,c=3;	//程序可读性
    String name = 'lcw';
    char x = 'X';
    double pi = 3.14;
    
  3. java变量是从心中最基本的存储单元,其要素包括变量名,变量类型和作用域

  4. 注意事项

    • 每个变量都有类型,类型可以是基本类型,也可以是引用类型
    • 变量名必须是合法的标识符
    • 变量声明是一条完整的语句,因此每一个声明都必须以分号结束
  5. 变量作用域

    • 类变量
    • 实例变量
    • 局部变量
    public class Demo{
        
        //类变量
        static double salary = 2500;
        
        
        //属性:变量
        
        //实例变量:从属于对象:如果不自行初始化,这个类型的默认值为0,false,null
        String name;
        int age;
        
        //main方法
        public static void main(String[] args){
            int i = 0;	//局部变量
            
            System.out.println(i);
            
            //变量类型	变量名字 = new Demo();
            Demo demo = new Demo();
            System.out.println(demo.age);
        }
        
        //其他方法
        public void add(){
            
        }
    }
    
    
  6. 变量的密码规范

    • 所有变量、方法、类名:见明知意
    • 类成员:首字母小写,驼峰原则
    • 局部变量:首字母小写,驼峰原则
    • 常量:大写字母和下划线
    • 类名:大写字母和驼峰原则
    • 方法名:首字母小写、驼峰原则

常量

  1. 常量(Constant):初始化(initialize)后不能再改变值,不会变动的值。

  2. 所谓常量可以理解理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被更改

    //修饰符(final),不存在先后顺序
    static final double PI = 3.14;
    final static double PI = 3.14;
    
  3. 常量名一般使用大写字符

运算符

  1. 算术运算符:+ - * / % ++ –

  2. 赋值运算符:=

  3. 关系运算符:> < >= <= == != instanceof

  4. 逻辑运算符:&& || !

  5. 位运算符:& | ^ ~ >> << >>>(了解!!!)

  6. 条件运算符:?:

  7. 扩展赋值运算符:+= -= *= /=

    short a = 10;
    byte b =20;
    System.out.println(a+b);	//返回int类型
    
    int a = 3;
    int b = a++;	//执行完这行代码后,先给b赋值,再自增
    int c = ++a;	//执行完这行代码前,先自增,再给c赋值
    
    
    //幂运算
    double pow = Math.pow(3,2);
    System.out.print(pow);	//9.0
    
    //位运算
    /*
    	A = 0011 1100
    B = 0000 1101
    	
    	A&B = 0000 1100
    	A|B = 0011 1101
    	A^B = 0011 0001
    	~B = 1111 0010
    	
    	
    	2*8 = 16  2*2*2*2
    	效率极高!!!
    	<<	*2
    	>>	/2
    	
    	0000 0000	0
    	0000 0001	1
        0000 0010	2
    	0000 0011	3
    	0000 0100	4
    	。。。
    	0000 1000	8
    	0001 0000	16
    */
        System.out.println(2<<3);
    
    
    //字符串连接符	+	,String
    System.out.println(""+a+b);
    System.out.println(a+b+"");
    
    //x?y:z
    //如果x==true,则结果为y,否则结果为z
    
    

包机制

  1. 为了更好地组织类,java提供了包机制,用于区别类名的命名空间

  2. 包语句的语法格式为:

    package pk1[.pkg2[.pkg3...]];(定义包)
    
  3. 一般利用公司域名倒置作为包名:www.baidu.com com.baidu.www

  4. 为了能够使用某一个包的成员,我们需要在java程序中明确导入该包,使用“import”语句可完成此功能

    import package1[.package2..].(classname|*);(导入包)
    

javaDoc生成文档

  1. javadoc命令是用来生成自己API文档的
  2. 参数信息
    • @author作者名
    • @version版本号
    • @since指明需要最早使用的jdk版本
    • @param参数名
    • @return返回值情况
    • @throws异常抛出情况
  3. cmd生成API

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pXrj0YM-1615893238412)(D:\大三下\java学习\练习\003javadoc\1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WO5xR9b2-1615893238413)(D:\大三下\java学习\练习\003javadoc\2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0p5yIaMm-1615893238415)(D:\大三下\java学习\练习\003javadoc\3.PNG)]

  1. IDEA生成API

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7B4KIyWg-1615893238416)(C:\Users\lichaowen\AppData\Roaming\Typora\typora-user-images\image-20210313155154525.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xa0drgrC-1615893238417)(C:\Users\lichaowen\AppData\Roaming\Typora\typora-user-images\image-20210313155028429.png)]

Java流程控制

Scanner

  1. java.util.Scanner是java5的新特征,可以通过Scanner类来获取用户的输入

  2. 基本语法:

    Scanner s = new Scanner(System.in);
    
  3. 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据

public class Demo{
    public static void main(String[] args){
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("使用next方式接收:");
        
        //判断用户有没有输入字符串
        if(scanner.hasNext()){
            //使用next方式接收
            String str = scanner.next();//程序会等待用户输入完毕
            System.out.println("输出的内容为:" + str);//假设输入为"hello world",输出为"hello"
        }
        
        //养成用完就关掉的好习惯
        scanner.close();
    }
}

public class Demo{
    public static void main(String[] args){
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数据:");
        String str = scanner.nextLine();
        System.out.println("输出的内容为:" + str);
        scanner.close();
    }
}

public class Demo{
    public static void main(String[] args){
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        //和
        double sum = 0;
        //计算输入了多少个数字
        int m = 0;
        //通过循环判断是否还有输入,并在里面对每一次进行求和统计
        while (scanner.hasNextDouble()){
            double x = scanenr.nextDouble();
            m = m + 1;
            sum = sum + x;
        }
        System.out.println(m + "个数的和为:" + sum);
        System.out.println(m + "个数的平均值为:" + (sum / m));
        
        scanner.close();
    }
}

  1. next()和nextLine()的区别
  • next():
    1. 一定要读取到有效字符后才可以结束输入
    2. 对输入有效字符之前的空白,next()会自动舍去
    3. 只有输入有效字符后才将其后面输入的空白作为分隔符或结束符
    4. next()不能得到带有空格的字符串
  • nextLine()
    1. 以Enter键为结束符,nextLine()返回回车之前的所有字符
    2. 可以获取空白

顺序结构

从上到下依次执行

选择结构

  1. if单选择结构

    if(boolean判断){
        执行内容;
    }else{
        执行内容;
    }
    
    //equal:判断字符串是否相等	xxx.equal("xxx")
    
  2. if双选择结构

    Scanner scanenr = new Scanner(System.in);
    System.out.println("请输入成绩:");
    int score = scanner.nextInt();
    if(score>60){
        System.out.println("及格");
    }else{
        System.out.println("不及格");
    }
    
    scanner.close();
    
  3. if多选择结构

    if(boolean判断){
        执行内容;
    }else if(boolean判断){
        执行内容;
    }else if(boolean判断){
        执行内容;
    }else if(boolean判断){
        执行内容;
    }else{
        执行内容;
    }
  1. 嵌套的if结构
    if(boolean判断){
        执行内容;
        if(boolean判断){
            执行内容;
        }
    }
  1. switch多选择结构
//case穿透    
switch(expression){
        case value:
            //语句
            break;
        case value:
            //语句
            break;
        case value:
            //语句
            break;
            ...
        default :
            //语句
    }

循环结构

  1. while循环

    • while是基本的循环,它的结构如下:
    while(布尔表达式){
     //循环内容
    }
    
    • 只要布尔表达式为true,循环就会一直执行下去

    • 大多数情况是要让循环停止下来,需要一个让表达式失效的方式来结束循环

    • 少部分情况需要一直执行,比如服务器的请求响应监听

    • 循环条件一种为true就会造成死循环,正常的业务编程中,应尽量避免死循环,会影响程序性能或者造成程序卡死崩溃

  2. do…while循环

    • 对于while语句而言,如果不满足条件,则不能进入循环,但有时候我们需要即使不满足条件也要至少执行一次

    • do…while循环和while循环相似,不同的是,do…while循环至少会执行一次

      do{
          //代码语句
      }while(布尔表达式);
      
    • while的do…while的区别

      1. while先判断后执行,do…while先执行后判断!
      2. do…while总是保障循环体会被至少执行一次!这是他们的主要区别
  3. for循环

    • for循环语句是支持迭代的一种通用结构,是最有效的、最灵活的循环结构

    • for循环执行的次数实在执行前就确定的,语法格式如下:

      for(初始化;布尔表达式;更新){
          //代码语句
      }
      
      public class Demo{
          public static void main(String[] args){
              //死循环
              for(; ; ){
              }
              
              //用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
              for(int i = 0; i <= 1000; i++){
                  if(i % 5 == 0){
                      System.out.print(i + "\t");
                  }
                  if(i % (5*3) == 0){
                      System.out.println();
                      System.out.print("\n");
                  }
              }
              
              //打印九九乘法表
              int i;
              int j;
              for(i = 1;i <= 9; i++){
                  for(j = 1; j <= i ; j ++){
                      System.out.print(j+"*"+i+"="+(i * j)+"\t");
                  }                 			 			 	System.out.println();
              }
          }
      }
      
      
  4. 增强for循环

    • java5引入了一种主要用于数组或集合的增强型for循环

    • java增强for循环语法格式如下:

      for(声明语句 : 表达式)
      {
          //代码语句
      }
      
              //定义一个数组
         int[] num = {10,20,30,40,50,60};
      
         //遍历输出数组num
         for(int x : num){
             System.out.println(x);
         }
      
    • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等

    • 表达式:表达式是要访问的数组名,或者是返回值为数组的方法

break、continue

  1. break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句

  2. continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断

  3. 关于goto关键字

    • goto关键字很早就在程序设计语言中出现,尽管goto仍是java的一个保留字,但并未在语言中得到正式使用:java没有goto。然而,在break和continue这两个关键字的身上,我们仍然可以看出一些goto的影子----带标签的break和continue

    • “标签”是指后面跟一个冒号的标识符,例如:label:

    • 对java来说唯一用到标签的地方是在循环语句之前,而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另外一个循环,由于break和continue关键字通常指中断当前循环,大若随同标签使用,他们就会中断到存在标签的地方

java方法

  1. 方法是语句的集合,他们在一起执行一个功能

    • 方法是解决一类问题的步骤的有序组合
    • 方法包含于类或对象中
    • 方法在程序中被创建,在其他地方被引用
  2. 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合,我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样有利于我们后期的扩展

  3. 方法的定义

    • 方法包含一个方法头一个方法体

      修饰符 返回值类型 方法值(参数类型 参数名称){
          方法体
          return 返回值;
      }
      return 0;//可以终止方法
      
  4. 方法的重载

    • 重载就是一个类中,有相同的函数名称,但形参不同的函数
    • 方法重载的规则:
      1. 方法名称必须相同
      2. 参数列表必须不同
      3. 方法的返回类型可以想同也可以不同
      4. 仅仅返回类型不同不足以成为方法的重载
    • 实现理论:
      1. 方法名称相同是,编译器会根据调用方法的参数个数、参数类型等逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错
  5. 递归-

    • 递归包括两个部分:
      1. 递归头:什么时候不调用自身方法,如果没有头,将陷入死循环
      2. 递归体:什么时候需要调用自身方法
    public class Demo(){
        public static void main(String[] args){
            System.out.println(f(3));
        }
        
        public static int f(int n){
            if(n == 1){
                return 1;
            }else{
                return n*f(n-1);
            }
        }
    }
    
    
    边界条件:边界
    前阶段
    返回阶段
    

java数组数组的定义

  1. 数组的定义

    • 数组是相同类型数据的有序集合

    • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成

    • 其中,每一个数据称作一个数组元素,每个元素可以通过下一个标来访问他们

      public class ArrayDemo{
          public static void main(String[] args){
              //变量的类型 变量的名字	=	变量的值
              //数组的定义
              
              //注意声明的时候数组不存在,new的时候才创建了数组
              int[] nums;	//首选(声明)
              int nums2[];
              nums = new int[10];//这里面可以存放10个数字
              
          }
      }
      
      //静态初始化:创建 + 赋值
      int[] a = {1,2,3,4,5,6,7,8};
      
      //动态初始化:包含默认初始化
      int[] b = new int[10];
      
    • 数组的基本特点

      1. 其长度是确定的,数组一旦被创建,它的大小就是不可以改变的
      2. 其元素必须是相同类型,不允许出现混合类型
      3. 数组中的元素可以是如何数据类型,包括基本类型和引用类型
      4. 数组变量属引用类型,数组也可以看出是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
    • 二维数组

      int a[][] = new int[2][5];
      
  2. Array类讲解

    int[] a = {1,3,7,2,6,5,4}
    
    System.out.println(a);//打印出内存地址
    System.out.println(Arrays.toString(a));//遍历数组a
    
    
    int[] b = {1,3,7,2,6,5,4};
    Arrays.sort(b);//对数组b进行从小到到的排序
    System.out.println(Arrays.toString(b));//[1,2,3,4,5,6,7]
    
    
    int[] c = {1,3,7,2,6,5,4};
    Arrays.fill(a,0);//数组填充
    System.out.println(Arrays.toString(b));//[0,0,0,0,0,0,0]
    
  3. 稀疏数组

        //建立一个11*11的数组
        int[][] a = new int[11][11];
        a[1][2] = 1;
        a[2][3] = 2;

        //遍历该数组
        for(int[] n : a){
            for(int m : n){
                System.out.print(m+"\t");
            }
            System.out.println();
        }

        System.out.println("====================");

        //计算该数组的有效数字个数
        int sum = 0;
        for(int i = 0; i < 11; i++){
            for(int j = 0; j < 11; j++){
                if(a[i][j] != 0){
                    sum++;
                }
            }
        }


        //建立一个稀疏数组
        int[][] b = new int[sum + 1][3];
        b[0][0] = 11;
        b[0][1] = 11;
        b[0][2] = sum;
        int c = 1;

        //遍历二维数组,将非零的值,存放稀疏数组中
        for(int i = 0; i < 11; i++){
            for(int j = 0; j < 11; j++){
                if(a[i][j] != 0){
                    b[c][0] = i;
                    b[c][1] = j;
                    b[c][2] = a[i][j];
                    c++;
                }
            }
        }

        //输出稀疏数组
        for(int[] m : b){
            for(int n : m){
                System.out.print(n+"\t");
            }
            System.out.println();
        }

        System.out.println("====================");


        //1.读取稀疏数组
        int[][] array = new int[b[0][0]][b[0][1]];

        //2.给其中的元素还原其他的值

        for(int i = 1; i < b.length; i++){
            array[b[i][0]][b[i][1]] = b[i][2];
        }

        //3.打印数组array
        for(int[] n : array){
            for(int m : n){
                System.out.print(m+"\t");
            }
            System.out.println();
        }

面向对象

  1. 面向过程思想

    • 步骤清晰简单,第一步做什么,第二步做什么…
    • 面对过程适合处理一些较为简单的问题
  2. 面向对象思想

    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行但对思考。最后,才对摸个分类下的细节进行面向过程的思索。
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
  3. 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,任然需要面向过程的思路去处理

  4. 什么是面向对象

    • 面向对象编程(Object-Oriented Programming,OOP)

    • 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据

    • 抽象

    • 三大特性:

      • 封装
      • 继承
      • 多态
    • 从认识论角度考虑是现有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

    • 从代码运行角度考虑是先有类后有对象。类是对象的模板

    • 方法的调用

      public class Demo03 {
          //静态方法
      
          //非静态方法
          /*
              实例化这个类new
              对象类型    对象名 =   对象值
           */
          Student student = new Student();
      }
      
      
      
      //学生类
      public class Student {
      
          //非静态方法
          public static void say(){
              System.out.println("学生说话了");
          }
      }
      
      //static方法和类一起加载
      public static void a(){
          b();
      }
      //类实例化之后才存在
      public void b(){
      }
      //所以已有的方法不能调用没有的方法
      
    • 值传递

    public class Demo(){
        public static void main(String[] args){
            int a = 1;
            System.out.println(a);//1
            //
            Demo.change(a);
            
            System.out.println(a);//1
        }
        //返回值为空
        public static void change(int a){
            a = 10;
        }
    }
    
    • 引用传递

      //引用传递:对象,本质还是值传递
      public class Demo(){
        public static void main(String[] args){
      	Person person = new Person();
            
            System.out.println(person.name);//null
            
            Demo.change(person);
            
            System.out.println(person.name);//lcw
            
        }
        //返回值为空
        public static void change(Person person){
            person.name = "lcw";
        }
      }
      
      
      //定义一个Person类,有一个属性:name
      class Person{
          String name;//null
      }
      
  5. 类与对象的创建

    //学生类
    public class Student {
        //属性:字段
        String name;    //null
        int age;        //0
    
        //方法
        public void study(){
            System.out.println(this.name + "在学习");
        }
    }
    
    
    
    //一个项目应该只存在一个main方法
    public class Application {
        public static void main(String[] args) {
    
            //类:抽象的,实例化
            //类实例化后会返回一个自己的对象
            //student对象就是一个Student类的具体事例
    
            Student xiaoming = new Student();
            Student xiaohong = new Student();
    
            xiaoming.name = "小明";
            xiaoming.age = 3;
    
            System.out.println(xiaoming.name);//小明
            System.out.println(xiaoming.age);//3
    
            System.out.println(xiaohong.name);//null
            System.out.println(xiaohong.age);//0
        }
    }
    
  6. 构造器

    • 使用new关键字创建对象

    • 使用new关键字创建的时候,处了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用

    • 类中的构造器也称为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点

      • 必须和类的名字相同
      • 必须没有返回类型,也不能写void
      public class Person {
          public Person() {
          }
      }
      
          //new 实例化一个对象
              Person person = new Person();
      
      
              System.out.println(person.name);//lcw
      
      
      public class Person {
          //一个类即使什么都不写,他也会存在一个方法
          //显示的定义构造器
      
          String name;
      
          //实例化初始值
          //1.使用new关键字,必须要有构造器
          public Person(){
              this.name = "lcw";
          }
      }
      
          //new 实例化一个对象
              Person person = new Person("zhuli");    //zhuli
      
      
              System.out.println(person.name);
              System.out.println();
      
      
      
      public class Person {
          //一个类即使什么都不写,他也会存在一个方法
          //显示的定义构造器
      
          String name;
      
          //实例化初始值
          //1.使用new关键字,必须要有构造器
          //2.初始化值
          public Person(){
              this.name = "lcw";
          }
      
          //有参构造:一旦定义有参构造,无参就必须显示定义
          public Person(String name){
              this.name = name;
          }
      }
      
  7. 封装

    • 该露的露,该藏的藏

      • 程序设计追求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
    • 封装(数据的隐藏)

      • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
    • 属性私有,get/set

      public class Student(){
          //属性私有
          private String name;
          private int id;
          private char sex;
          
          //提供一些可以操作这个属性的方法!
          //提供一些public的get、set方法
          
          public String getName(){
              return this.name;
          }
          public void setName(String name){
              this.name = name;
          }
      }
      
      
      /*
      1.提高程序的安全性
      2.隐藏代码的实现细节
      3.可维护性
      */
      
      Student s1 = new Student();
      s1.setName("lcw");
      System.out.println(s1.getName);//lcw
      
  8. 继承(私有的东西不能被继承)

    • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

    • extands的意思是“扩展”。子类是父类的扩展

    • java中只有单继承,没有多继承

    • 继承是类和类之间的一种关系。除此之外,类和类之间的的关系还有依赖、组合、聚合等

    • 继承关系的两个类,一个为子类(派生类)一个为父类(基类)。子类继承父类,使用关键字extends来表示

    • 子类和父类之间,从意义上讲应该具有“is a“的关系

    • object类

    • super

      • super调用父类的构造方法,必须在构造方法的第一个
      • super必须只能从现在子类的方法或构造方法中
      • super和this不能同时调用构造方法
      //一个项目应该只存在一个main方法
      public class Application {
          public static void main(String[] args) {
      
              Student student = new Student();
      
              student.test("lsh");
              //lsh	lsw		lcw
          }
      }
      
      
      //Person    人:父类
      public class Person {
      
          protected String name = "lcw";
      
      }
      
      
      
      
      //学生类   子类,派生类
      public class Student extends Person{
          //属性私有
          private String name = "lsw";
      
          public void test(String name){
      
              System.out.println(name);	
              System.out.println(this.name);
              System.out.println(super.name);
          }
      }
      
    • this

      • 代表的对象不同:
        • this:本身调用者这个对象
        • super:代表父类对象的应用
      • 前提
        • this:没有继承也可以使用
        • super:只能做基础条件才可以使用
      • 构造方法
        • this();本类的构造
        • super();父类的构造
    • 方法重写

      1. 需要有继承关系,子类重写父类的方法
      2. 方法名必须相同
      3. 参数列表必须相同
      4. 修饰符:范围可以扩大但不能缩小:public>protected>default>private
      5. 抛出的异常:范围,可以被缩小,但不能扩大: classnotfoundexception —> exception(大)
      6. 为什么需要重写:
        • 父类的功能,子类不一定需要,或者不一定满足
      • 静态的方法重写
      public class Application {
          public static void main(String[] args) {
              //方法的调用只和左边,定义的数据类型有关
              A a = new A();
              a.test();//A=>test()
      
              //父类的引用指向了子类
              B b = new A();
              b.test();//B=>test()
          }
      }
      
      
      
      public class B {
          public static void test(){
              System.out.println("B=>test()");
          }
      }
      
      
      
      public class A extends B{
          public static void test(){
              System.out.println("A=>test()");
          }
      }
      
      
      • 非静态的方法重写
      public class Application {
          public static void main(String[] args) {
              //方法的调用只和左边,定义的数据类型有关
              A a = new A();
              a.test();//A=>test()
      
              //父类的引用指向了子类
              B b = new A();
              b.test();//A=>test()
          }
      }
      
      
      
      
      public class B {
          public void test(){
              System.out.println("B=>test()");
          }
      }
      
      
      
      
      
      public class A extends B{
          public void test(){
              System.out.println("A=>test()");
          }
      }
      
      
  9. 多态

    注意事项:

    • 多态是方法的多态,属性没有多态
      • 父类和子类,有联系 类型转换异常
      • 存在条件:继承关系,方需要重写,父类引用指向子类对象 Father f 1 = new Son();
        1. static方法,属于类,他不属于实例
        2. final常量
        3. private方法
    public class Application {
        public static void main(String[] args) {
    
            //一个对象的实际类型是确定的
            //new Student();
            //new Person();
    
            //可以指向的应用类型就不确定了,父类的引用指向子类
    
            //Student 能调用的方法都是自己的或者继承父类的!
            Student s1 = new Student();
            //Person 父类型,可以指向子类,但是不能调用子类独有的方法
            Person s2 = new Student();
            Person p1 = new Person();
            Object s3 = new Student();
    
            //对象能执行那些方法,主要看对象左边的类型,和右边类型关系不大
            s1.run();       //studentrun
            s1.eat();
    
            s2.run();//子类重写了父类的方法,执行子类的方法//studentrun
    //        ((Student)s2).eat();
            p1.run();
        }
    }
    
    
    public class Person {
    
        public void run(){
            System.out.println("personrun");
        }
    }
    
    
    
    public class Student extends Person{
        public void run(){
            System.out.println("studentrun");
        }
    
        public void eat(){
            System.out.println("eat");
        }
    }
    
    
  10. instancepf(类型转换) 引用类型,判断一个对象是什么类型
  11. 抽象类

    //abstract抽象类
    //抽象类可以写普通方法
    //抽象方法必须在抽象类中
    //不能去new这个抽象类,只能靠子类去实现它
    public abstract class Action{
        //约束,有人帮我们实现
        //abstract,抽象方法,只有方法名字,没有方法体
        public abstract void doSomething();
    }
    
    
    //抽象类的所有方法,继承了它的子类,都必须要实现他的方法,除非他也是抽象类
    public A extends Action{
        public void doSomething(){
            System.out.println("A");
        }
    }
    
  12. **接口 interface(只有规范,自己无法写方法)**约束和实现分离

    //interfance定义的关键字,接口都需要一个实现类
    public interface UserService{
        //接口中的所有定义其实都是抽象的public abstract
        
        void add(String name);
        void delete(String name);
        void update(String name);
        void query(String name);
    }
    
    //类可以实现接口欧implements接口,可以多个接口
    public class UserServiceImpl implements UserService{
        void add(String name){};
        void delete(String name){};
        void update(String name){};
        void query(String name){};
    }
    
    
  13. 异常(Exception)

    //自定义的异常类
    public class MyException extends Exception{
        //传递数字>10;
        private int detail;
        
        public MyException(int a){
            this.detail = a;
        }
        
        //toString:异常的打印消息
        
        @Override
        public String toString(){
            return "MyException{" + 
                "detail=" + detail + '}';
        }
    }
    
    
    public class Test{
        //可能会存在异常的方法
        static void test(int a) throws MyException{
            System.out.println("传递的参数为:" + a);
            if(a>10){
                throw new MyException(a);//抛出
            }
            System.out.println("ok");
        }
        public static void main(String[] args){
            try{
                test(11);
            }catch(MyException e){
                System.out.println("MyException"+e);
            }
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值