JAVA语言入门学习

常用DOS命令

一、win+r  --》cmd

编译-->  javac  文件名.java

执行 --> java  文件名

二、 dos命令; 

                        (1)切换盘符:c:或d:或e:  大小写没有区别


                        (2)显示具体信息:dir


                        (3)改变当前目录 cd Java


                        (4)cd .代表当前目录  cd ..代表上一层目录


                        (5)清屏:cls   ----》c语言的是Ctrl+l。
                        (6)切换历史已操作命令:上下箭头
                        (7)补全文件目录命令:tab按键     切换相同首字母的文件夹
                        (8)创建目录: md  文件名    删除目录:rd 文件名
                        (9)复制文件命令:copy 文件名.txt   路径\文件名.txt
                        (10)删除文件内容 :del 文件名  

                        (11)移动文件:move

JAVA语言注释

//下面是一段标准代码
//这是代码的“框子”,当前阶段你可以当做一个模板
//其实这就是一个类,类的名字是Hel1oWorld,这个名字可以随便起,但是一般首字母大写,驼峰命名,见名知意
public class HelloWorld[
//下面是一个main方法,方法的格式是固定的
          public static void main (String [] args)(
        //下面这句话的作用:将双引号中的内容进行原样输出
        /*
       这是多行注释
       每行都可以写
       单行注释和多行注释,按照你自己的需求去使用即可
       */
      System.out.println("hi....java");
      }
}

二、文档注释
/**
文档注释
@author zhaoss
@version1.0
*/
public class HelloWorld{
          /**
         文档注释
          @param name 姓名
          @param age  年龄
          */ 
          public static void main (String [] args)(
      System.out.println("hi....java");
      }
}

初始java

public class HiWorld{
    public static void main(String[] args){
                    Stystem.out.print("姓名:");
        Stystem.out.println("莉莉");
        Stystem.out.print("职业");
        Stystem.out.println("学生");
    }
     }
(1)System.out.print和System.out.println区别联系:
System.out.print:将双引号中内容原样输出,不换行
system.out.println:将双引号中内容原样输出,换行
*/
(2)转义字符 ,
\就是转义字符:作用:将后面普通的字母转换为特殊含义
\n:换行
\t:   空格
*/

标识符

标识符:包,类,变量,方法.....等等,只要是起名字的地方,那个名字就是标识符
标识符定义规则:
1.四个可以(组成部分):数字,字母,下划线,美元符号$
注意:字母概念比较宽泛,指的是英文字母,汉字,日语,俄语……
但是我们一般起名字尽量使用英文字母
2.两个不可以:不可以以数字开头,不可以使用java中的关键字
3.见名知意:增加可读性
4.大小写敏感:int a;int A;
5.遵照驼峰命名:
类名:首字母大写,其余遵循驼峰命名
方法名,变量名:首字母小写,其余遵循驼峰命名
包名:全部小写,不遵循驼峰命名
 

常量和变量

常量分为两种:
常量通常指的是一个固定的值,例如:1、2、3、'a'、'b'、true、false、"helloWorld”等。
在Java语言中,主要是利用关键字final来定义一个常量。常量一旦被初始化后不能再更改其值。
为了更好的区分和表述,一般将1、2、3、'a’、'b’、true、false、”helloWorld”等称为字面常量,而使用final修饰的Pl等称为符号常量(字符常量)。

字面常量的类型
整型常量 12333
实型常量 3.1415926
字符常量 'a'   -----------------》char单引号
逻辑常量 true false
字符串常量"helloworld"-----》String双引号

注意:逻辑常量就两个值,一个是true,一个是false

变量

变量声明:int 定义整型变量。float定义浮点型变量。


注意 :一定要赋值,不然如上图一样报错尚未初始化


变量赋值:可以直接int age =10;


习题

答案都是:20 

变量的作用域

 no表示无法正常输出。

 数据类型

扩展一个知识点有关于进制转换的,给变量赋值可以为不同进制的。

 各数据类型的变量。

 浮点类型   float 表示6~7位和double表示8位以上

 float是4bit和double是8bit,两者代表的不一样。不能比较

字符型 (char)

 

 java中无论字母,数字,符号,中文都是字符类型。char本质上是utf-16编码的。

 注意:转义字符的用法

 字符和编码

 注意:无论你输出的是字面常量。

 面试题测试:

 答案是4:因为ch6为52,但是字符52在ASCII码刚刚好对应4

解释乱码问题

 用记事本选择编码方法的时候一般要选择为ANSI---》获取当前操作系统的编码格式:GBK

布尔类型:要么为ture要么为false

类型转换

 强制转换看左右级别

 特殊情况

 如果范围超过,比如取270,就是要强制转换;

byte b2 =(byte)270;

System.out.println(b2);   输出结果为14;

原因是byte是占一个字节,int占四个字节,超出部分,直接去掉。

 练习题

当常量被final修饰时候,这个常量就不能被更改。

当要自己设置输入值r:拿来一个扫描器(导入包),建立一个扫描器,让扫描器扫描一个录入的int数据类型

 scanner的深入使用

import java.util.scanner
public class TestVar{
public static void main(String[] args){
   //键盘录入学生的信息:年龄;身高,姓名,性别;
  Scanner cs =new Scanner(System.in);  //扫描器
  //键盘录入年龄;(接收int类型数据)
  System.out.print("请录入年龄:");
  int age  = cs.nextInt(); 

  //键盘录入身高;(接收double类型数据)
  System.out.print("请录入身高:");
  double height  = cs.nextDouble();

  //键盘录入姓名;(接收字符串--》String类型数据)
  System.out.print("请录入姓名:");
  String name  = cs.next();
  
  //键盘录入性别;(接收字符---》char类型数据) 因为API中没有明确接收char类型的类,要利用字符串/转换一下
   System.out.print("请录入性别:");
   String sexStr  = cs.next();
   char sex =sexStr.charAt(0); //0代表索引值就是一个字符串"abc" 下标表示012,0代表取第一个字符a
   //上面两句可以合为一句表示:char sex= cs.next.charAt(0);
   System.out.println("该学生的信息为:姓名是:"+name+",年龄是:"+age+",身高是:"+height+
",性别是:"+sex);
   }
}

 上面是一个初步的java认识,下面算是正式进入学习,会分类比较细,主要以练习题目代码为主,一个合格的程序员,代码最少要敲2万行以上。


运算符

算数运算符(+,-,*,%,++(自增),--(自减))

/ 除法运算符:表示两个数相除运算

% 取余运算符:用来求余数的

public class TestVer2{
    public static void main(String[] args){
//打印结果
        System.out.println(12/3); //4
        System.out.println(12%5);  //2
        System.out.println(12/3.0); //4.0
        System.out.println(12%5.0); //2.0
    }
}

练习:实现功能:任意给出一个四位数,求出每位上的数字。

import java.util.scanner;
public class TestOpen1{
    public static void main(String[] args){
    //实现功能:给一个数字,输出每一位数字。
    //扫描器读取屏幕
    scanner sc =new scanner(system.in);
    System.out.print("请输入一个4位数字");
    int num =sc.nextInt();
    
    //1.求出每位上的数字;
    //个位数;
    int num1 =num%10;  
    System.out.print("个位数:"); 

    //十位数
    int num2 =num/10%10;   //1234---->123---->3
    System.out.print("十位数:");

    //百位数
    int num3 =num/100%10;   //11234--->12--->2
    System.out.print("百位数:");    


    //千位数
    int num4 =num/1000;     //1234---->1
    Syetem.out.print("千位数:");
    
  }
}

/ 加法运算符:表示正数,相加,拼接操作

 /++(自增),--(自减)运算符

 无论这个变量是否参与到运算中去,只要用++运算符,这个变量本身就是加1操作。只是对这个运算结果会产生影响

练习

这道题比较复杂,搞懂这个就说明会了,下面是解题思路 。

赋值运算符(=) 

用一个题目去深入了解这个运算符。

交换两个数字:

import java.util.Scanner;
public class TestOpen2{
    public static void main(String[] args){
    //任意给出两个数字,交换两个数并且输出;
    Scanner sc=Scanner(System.in);
    int num1=sc.nextInt();
    int num2=sc.nextInt();
    
     System.out.println("交换前:"+num1+"\t"+num2);
    //交换
    /*错误代码
    num1 =num2;
    num2 =num1;
    */
    
    //解决办法;
    //引入一个中间变量;
    int t;
    t=num1;
    num1=num2
    num1=t;

    //输出交换前的两个数字;
 
   System.out.println("交换后:"+num1+"\t"+num2);
    }
}

扩展运算符(+=,-=,*=,/=)

 面试题

 关系运算符(>,<,>=,<=,==,!=)

 逻辑运算符(&,&&,|,||)

三元运算符(a?b:c)

 

 位运算符(了解)

 3<<2 (3左移2位)

 

 面试题:4乘以8最快的方式:4<<3

 运算符的优先级

流程控制

流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的逻辑模块。分为3类,顺序,选择(也称分支)循环结构

顺序结构(先执行a,再执行b)

不是重点,忽略不计。

选择结构(如果.....否则)

if语句单分支

if(布尔类型){ 返回true执行里面的语句}

import java.util.Scanner;
public class TestOpen2{
    public static void main(String[] args){
   //给出3个数字(1-6),对三个数字求和计算,根据和的大小来分配不同奖品。
   Scanner sc = new Scanner(System.in); 
   //键盘输入3个数字
    int num1=sc.nextInt();
    int num2=sc.nextInt();
    int num3=sc.nextInt();
   //求和int num=num1+num2+num3;
   int sum =0;
   sum+=num1;
   sum+=num2;
   sum+=num3;
    System.out.println("和为:"+sum);
 
   //根据和判断奖品:
     if(sum>=14){
       System.out.println("一等奖");
      }
      if(sum>=10&&sum<14){
       System.out.println("二等奖");
      }
      if(sum>=6&&sum<10){
       System.out.println("三等奖");
      }
       if(sum<6){
       System.out.println("四等奖");
      }
   }
}

 if语句多分支

import java.util.Scanner;
public class TestOpen2{
    public static void main(String[] args){
   //给出3个数字(1-6),对三个数字求和计算,根据和的大小来分配不同奖品。
   Scanner sc = new Scanner(System.in); 
   //键盘输入3个数字
    int num1=sc.nextInt();
    int num2=sc.nextInt();
    int num3=sc.nextInt();
   //求和int num=num1+num2+num3;
   int sum =0;
   sum+=num1;
   sum+=num2;
   sum+=num3;
    System.out.println("和为:"+sum);
 
   //根据和判断奖品:利用一个多分支
   //else 隐藏了一个条件,与上面分支表达式相反。
     if(sum>=14){
       System.out.println("一等奖");
      }else if(sum>=10){  //隐藏了sum<14
       System.out.println("二等奖");
      }else if(sum>=6){   //隐藏了sum<10
       System.out.println("三等奖");
      }else{               //隐藏了sum<6
       System.out.println("四等奖");
      }
   }
}

if语句双分支

import java.util.Scanner;
public class TestOpen2{
    public static void main(String[] args){
   //给出3个数字(1-6),对三个数字求和计算,根据和的大小来分配不同奖品。
   Scanner sc = new Scanner(System.in); 
   //键盘输入3个数字
    int num1=sc.nextInt();
    int num2=sc.nextInt();
    int num3=sc.nextInt();
   //求和int num=num1+num2+num3;
   int sum =0;
   sum+=num1;
   sum+=num2;
   sum+=num3;
    System.out.println("和为:"+sum);
 
   //根据和判断奖品:利用一个双分支
   //else 隐藏了一个条件,与上面分支表达式相反。
    if(sum>=10){
       System.ou.println("中奖");
    }else{
       System.ou.println("没中奖");
    }


//if-else双分支可以条件运算符进行替换:System.ou.println(sum>=10?"中奖了":"没中奖");
 
   }
}

随机数(依靠一个Math类生成随机数)

Math.random()------->[0.0 , 1.0)

Math.random()*6------->[0.0 , 6.0)右边是开区间只能取到5.9,

(int)(Math.random()*6)------[0 , 5]              (int)(Math.random()*6)+1------[1 , 6]    

public class TestOpen3{
    public static void main(String[] args){
   //随机生成一个0到1的数字
    int num1=(int)(Math.random()*6)+1;//范围是1到6;
    int num2=(int)(Math.random()*6)+1;
    int num3=(int)(Math.random()*6)+1;
    int num=num1+num2+num3;
            System.out.println(num1);
            System.out.println(num2);
             System.out.println(num3);
    System.out.println(num);
   if(num>14){
      System.out.println("中奖");
     }else{
       System.out.println("中奖");
        }
   }
}

练习[36,92] ------->[0~56]+36         (int)(Math.random()*57)+36

分支结构练习题1

import java.util.Scanner;
public class TestOpen4{
    public static void main(String[] args){
    Scanner sc =new Scanner(System.in);
    System.out.print("请输入会员积分:");
    //先判断键盘录入数据是不是int类型的
     if(sc.hasNextInt()==true){
      //是int类型数据,将这个int类型的数据接收;
     
   
       int score= sc.nextInt();
      if(score>=0){
         if(score>8000){
                 System.out.print("该会员享受的是:0.6");
             }else if(score>=4000){
                 System.out.print("该会员享受的是:0.7");
             }else if(score>=2000){
                 System.out.print("该会员享受的是:0.8");
             }else{
                 System.out.print("该会员享受的是:0.9");   
             }
         }else{ 
              System.out.println("对不起你录入的积分是负数,不符合要求");
             }
   }
   else{
       //不是int类型
      System.out.println("你输入的不是int类型")
     }
   } 
}

分支结构练习题2

练习:
小朋友搬桌子:
年龄大于7岁,可以搬桌子;
如果年龄大于5岁,性别是男,可以搬桌子;
否则不可以搬动桌子,提示:你还太小了

import java.util.Scanner
public class TestOpen5{
  public static void main(String[] args){
   //录入小朋友年龄
    Scanner cs =new Scanner(System.in);
    System.out.println("请输入年龄");
    int age=cs.nextInt();
    
    //根据年龄判断
    if(age>=7){
           System.out.println("yes");
      }else if(age>=5){
           System.out.println("请输入性别,男:1  女:0");
           int sex =cs.nextInt();
           if(sex=1){//男
             System.out.println("yes");
           }else{//女
            System.out.println("no");
           }     
        }else{  //age<5
             System.out.println("no,年龄太小");
           }
   }

}

或者可以直接输入字符串,用chatAt(0)取输入的第一个字符

switch分支

因为会执行后面所有代码,为了防止代码的穿透效果,在每个分支加上break。

 循环结构

while循环

底层重复执行代码,提高了程序员编写效率

public class TestOpen4{
    public static void main(String[] args)
    //功能:1+2+3+4+5
    int num=1;//定义一个变量  【1】条件初始化
    int sum =0;//定义一个求和变量,用来接收和;
    while(num<=5){    【2】条件判断
      sum+=num;        【3】循环体
      num++;            【4】迭代
      }
    //输出和
   System.out.println(sum);

}

练习题 

do--while循环

此循环和while差不多

两者的区别 

 for循环

三者循环结构是一样的效率。

关键字 

break

break标签可以制定跳出的循环

 counter

 return

循环练习题

1

 

 循环嵌套 

1.乘法口诀表

先看看编程思路,由简单到深入1

 倒乘法口诀

2.打印形状

上面长方形升级一下,把每行*前面多一些空格,显得美观。

 打印平行四边形

 第1行空8格,第2行空7格,第3行空6格。故空格数=9-行数。

 打印三角形

外循环,空格不用变,先分析*数和行数关系

 

 菱形,由上面三角形和下面三角形组成。

 空心菱形

在菱形加个if判断就可以,保留开始和结尾的*数,其余为空格。

 菱形打印扩展,另一种方式。

先由一个正方形改变,总结出起始位置,结束位置,两个位置中间就是输出*号,其余空格。size用来确定起始位置和结束位置。还可以自己设置菱形大小。

 

空心菱形就只需要在起始位置,结束位置打印*号。

 

 3.三重循环

同上,三重循环可以解决三元一次方程组的问题。

练习题

 因为3只小鸡1文钱,z应该是3的倍数,所以要把z除3中,余数不是0的去掉。

其实三元问题可以优化成二元方程。实际编程中比较少看到三元问题。

方法的定义/调用/重载

 

 方法提取

 对上述练习题猜数提取为一个方法。

 面试题(两数交换)

判断下面习题是否成功,并且主要探究是什么原因,为什么不成功。

程序一定是从main中开始执行,开辟一个栈空间,依次执行,其中调用chang方法后,a,b,赋值给num1,num2.在执行changnum的方法,然后changnum方法调用后要释放内存,其中改变的是num1,num2的值,而a,b,没有改变值。

方法的重载 

下面是方法的重载,直观感受。 

定义 :可以同时使用,不重复,不冲突。

数组的引入

单纯的求值中,无法求出每个学生的成绩。 

 数组的初步认识

 

 

 对数组内存存取的分析。

数组遍历方式

 

数组三种初始化方式

静态初始化   动态初始化  默认初始化

数组的应用 

1.最值问题

原理:打擂原理,设置一个擂主(一般是第一个),其他人上去比较。

可以利用方法对上述题目进行优化 

分析内存原理

2.查询问题 

查询索引 

 对上述查询索引提取方法,

3.添加功能 

逻辑原理

 

 对上述题目提取方法

 

4.删除功能 

一个返回字符串的类Arrays.toString();对数组遍历,返回一个好看的字符串。但是前提要导包,不然会报错。

删除指定位置上的元素

 优化一下

 再优化成通用规律

删除指定元素 

详细main方法讲解

 手动传入实参

可变参数

上述方法只是一个方法,不构成重载,所以只有第一个是对的。现在想解决这问题,设置一个方法,参数可变。当然只是部分,如果输入2.5,不符合int类型,就会报错。

 注意:4.可变参数和其他一起的时候一定要放最后面。自己写代码的时候,建议不要使用。

数组_Arrays工具类的使用

 数组的复制

二维数组

 代码与内存原理

遍历二维数组

 

 

 二维数组初始化方式

静态初始化

动态初始化

 

 默认初始化

 

 IDEA使用的方法

了解当前主流开发编程工具。

 详细使用方法在另一篇文章,不在此篇章赘述。




 面向对象

先搞定面向过程和面向对象的区别。注意:单纯在这讲区别,是无法彻底理解。它是一个长期的渐变,需要自己慢慢体会。

 

 经典案例:人把大象装进冰箱。

类和对象的关系

 面向对象的三个阶段



创建类

创建对象 

 

局部变量和成员变量的区别 

 局部变量一定要初始化才能打印出来,成员变量有默认值。

 

构造器 

 

 构造器的作用:不是为了创建对象,因为在调用构造器之前,这个对象就已经创建好了,并且有属性默认的初始化值,调用构造器的目的是给属性赋值的。但是我们一般不会在构造器中进行初始化操作,因为那样就写死了。注意系统会自动分配空构造器给你,但是有时会出错。

构造器的重载

 

内存分析

1.

 2.





this的使用

this关键字用法:
(1) this可以修饰属性:
总结:当属性名字和形参发生重名的时候,或者属性名字和局部变量重名的时候,都会发生就近原则,所以如果我要是直接使用变量名字的话,就指的是离的近的那个形参或者局部变量,这时候如果我想要表示属性的话,在前面要加上: this.修饰。 

 this修饰方法:

总结:在同一个类中,方法可以互相调用,this.可以省略不写。|

 (3) this可以修饰构造器:

总结:同一个类中的构造器可以相互用this调用,注意:this修饰构造器必须放在第一行

 

static修饰属性 

static可以修饰:属性,方法,代码块,内部类。
static修饰属性;

 static修饰属性总结:

(1)在类加载的时候一起加载入方法区中的静态域中

(2)先于对象存在

(3)访问方式:对象名.属性名类名.属性名(推荐)

static修饰属性的应用场景:

某些特定的数据想要在内存中共享,只有一块--》这个情况下,就可以用static修饰的属性

 

 属性分为两种: 静态属性(类变量)static string school        非静态属性(实例变量)id

static修饰方法

 

代码块

[1]类的组成;属性,方法,构造器,代码块,内部类
[2]代码块分类:普通块,构造块,静态块,同步块(多线程)
[3]代码:
普通块:在方法中

 注意时刻保持空构造器

总结: (1) 代码块执行顺序: 最先执待静态块,只在类加载的时候执行一次,所以一般以后实战写项目:创建工厂,数据库的初始化信息都放入静态块。 一般用于执行一些全局性的初始化操作。

再执行构造块,(不常用)

再执行构造器,

再执行方法中的普通块。

包_import详解

[1]生活案例:
邮寄快递:中国.北京.通州区.****小区.5号楼.3单元.101房.赵珊珊
历史:常山赵子龙
[2]包的作用:
为了解决重名问题(实际上包对应的就是盘符上的目录)
解决权限问题

包名定义

(1)名字全部小写。

(2)中间用.隔开。

(3)一般都是公司域名倒着写:comjdcom.msb

(4)加上模块名字: comjd.login com.jd.register

(5)不能使用系统中的关键字:nul,con,cpm1---com9..... 

(6)包声明的位置一般都在非注释性代码的第一行:

导包 

 

在Java中的导包没有包含和被包含的关系:
设置目录平级的格式(不是包含和被包含的显示)

 

面向对象三大特性

封装 

通过例子来熟悉私有封装。

 上面的代码,对于属性age来说,我加了修饰符private,这样外界对它的访问就受到了限制,现在我还想加上其他的限制条件,但是在属性本 身上没有办法再加了,所以我们通过定义方法来进行限制条件的添加。

进行封装: (1)将属性私有化,被private修饰--》加入权限修饰符 一旦加入了权限修饰符,其他人就不可以随意的获取这个属性 (2)提供public修饰的方法让别人来访问/使用 (3)即使外界可以通过方法来访问属性了,但是也不能随意访问,因为咱们在方法中可以加入限制条件。

际开发中,方法一般会写成 setter, getter方法: 可以利用IDEA快捷键生成:alt+insert -->getter and setter:

加深练习

字符串等于输入的值用equals

 

加入有参构造

 加入构造器后,限制可能不全面,所以需要复用。

四个权限修饰符:

 

继承

 

 代码演示

 

 继承的好处:提高代码的复用性
父类定义的内容,子类可以直接拿过来用就可以了,不用代码上反复重复定义了
需要注意的点:
父类private修饰的内容,子类实际上也继承,只是因为封装的特性阻碍了直接调用,但是提供了间接调用的方式,可以间接调用。

继承的内存分析

 方法的重写

方法重载和重写的区别:

重載:在同一个类中,当方法名相同,形参列表不同的时候多个方法构成了重载

重写:在不同的类中,子类对父类提供的方法不满意的时候,要对父类的方法进行重写

super修饰属性方法

 在特殊情况下,当子类和父类的属性重名时,你要想使用父类的属性,必须加上修饰符super.,只能通过super.属性来调用。
在特殊情况下,当子类和父类的方法重名时,你要想使用父类的方法,必须加上修饰符super.,只能通过super.方法来调用。
在这种情况下, super.就不可以省略不写。

super修饰构造器

其实我们平时写的空构造器的第一行都有:super() -->作用:调用父类的空构造器,只是我们一般都省略不写。

如果构造器中已经显示的调用super父类构造器,那么它的第一行就没有默认分配的super。

在构造器中,super调用父类构造器和this调用子类构造器只能存在一个,两者不能共存: 因为super修饰构造器要放在第一行,this修饰构造器也要放在第一行:

 继承条件下的执行方法。以后写代码构造器的生成可以直接使用IDEA提供的快捷键: alt+insert

 object类

toString()方法

 

 

 总结:toString的作用就是对对象进行“自我介绍”,一般子类对父类提供的toString都不满意,都要进行重写。

equals()方法

 

 

 总结:
equals作用:这个方法提供了对对象的内容是否相等的一个比较方式,对象的内容指的就是属性。
父类Object提供的equals就是在比较==地址,没有实际的意义,我们一般不会直接使用父类提供的方法,而是在子类中对这个方法进行重写。

比较两个不同类型的对象。

用eclipes生成equals方法---》hashcode

用idea生成equals方法。

类与类的关系

类和类可以产生关系:将一个类作为另一个类中的方法的形参。

另一种调用。

 

Mom后面有个初始值null,要改成一个具体的对象。

 总结:类和类可以产生关系的下面两种方法。
(1)将一个类作为另一个类中的方法的形参
(2)将一个类作为另一个类的属性

多态

多态跟属性无关,多态指的是方法的多态,而不是属性的多态。

子类向上抽取名字称为泛化。父类向下抽取称为继承。

案例:

 什么是多态: 多态就是多种状态:同一个行为,不同的子类表现出来不同的形态, 多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。多态的好处: 为了提高代码的扩展性。符合面向对象的设计原则:开闭原则。 开闭原则:指的就是扩展是开放的,修改是关闭的。

注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习反射 。

final修饰符

修饰变量

 修饰方法

修饰类

抽象类的抽象方法

[1]抽象类和抽象方法的关系: 抽象类中可以定义0-n个抽象方法。

[2]抽象类作用: 在抽象类中定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类的抽象方法,然后可以扩 展子类自己的内容。抽象类设计避免了子类设计的随意性。

面试题:

(1)抽象类不能创建对象,那么抽象类中是否有构造器? 抽象类中一定有构造器。构造器的作用给子类初始化对象的时候要先super调用父类的构造器。

(2)抽象类是否可以被final修饰? 不能被final修饰,因为抽象类设计的初衷就是给子类继承用的。要是被final修饰了这个抽象类了,就不存在继承了,就没有子类。

接口

JDK1.8之前

注意:修饰符可以省略不写,IDE会帮你自动补全,但是初学者建议写上,防止遗忘。

JDK1.8之后

 

内部类_成员内部类 

内部类分为成员内部类局部内部类

局部内部类(位置:方法内,块内,构造器内)

成员内部类(静态的,非静态的)

成员内部类

 

内部类_局部内部类

面对对象项目

异常

异常:Exception:在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,我们称之为发生异常。

处理异常:if_else处理

(1)代码臃肿,业务代码和处理异常的代码混在一起。 (2)可读性差 (3)程序员需要花费大量的经历来维护这个漏洞 (4)程序员很难堵住所有的漏洞。

 

注意: (1) try中如果出现异常,然后用catch捕获成功的话,那么try中后续的代码是不会执行的。 (2)如果catch捕获异常成功,那么try-catch后面的代码该执行还是执行没有影响。

 异常的处理方式。

 

 finally作用

多重

分类

 

throw与throws区别

总结: throw和throws的区别: (1)位置不同: throw:方法内部 throws:方法的签名处,方法的声明处 (2)内容不同: throw+异常对象(检查异常,运行时异常) throws+异常的类型(可以多个类型,用,拼接) (3)作用不同: throw:异常出现的源头,制造异常。 throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常。然后调用者对这个异常进行处理: 要么自己处理要么再继续向外抛出异常 

异常练习

 重载与重写异常的规则

重载同一方法名,不同形参列表。与异常没有关系。

自定义异常

如果继承的是运行时异常,那么在使用的时候无需额外处理
如果继承的是检查异常,那么使用的时候需要try-catch捕获或者throws向上抛。

常用类

包装类

 日期类

 

日期练习

jdk新增日期时间API的原因

Math类

Random类

String类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值