Java基础


打开CMD的方式

  1. 开始+系统+命令提示符

  2. win键+R 输入cmd打开控制台(推荐使用)

  3. 在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口

  4. 资源管理器的地址栏前面加上cmd路径

管理员方式运行:选择以管理员方式运行

 

常用Dos命令

 #盘符切换
 #查看当前目录下的所有文件  dir
 #切换目录  cd change  directory
 cd..
 #清理屏幕  cls   (clear screen)
 #退出终端  exit
 #查看电脑的ip  ipconfig
 ?
 #打开应用 
     calc
     mspaint
     notepad
 #ping命令
       ping www.baidu.com
 #文件操作
     md  目录名   MD——建立子目录
     rd  目录名   RD——删除子目录命令
     cd> 文件名   CD——改变当前目录
     del 文件名

JDK

卸载JDK

  1. 删除Java的安装目录

  2. 删除Java_HOM

  3. 删除path下关于java的目录

  4. java_version

安装JDK

  1. 百度搜多JDK8

  2. 同意协议

  3. 下载电脑对应的版本

  4. 双击安装JDK

  5. 记住安装的路径

  6. 配置环境变量

1.我的电脑– – >右键– –>属性

2.环境变量– – >JAVA_HOME

3.配置path变量

7.测试JDK是否安装成功

1.打开cmd

2.java -version

notepad++

第一个程序

HelloWord

 public class HelloWord{
   public static void main(String[] args){
     System.out.println("Hello Word!");
   }
 }

注意点:

  1. 每个单词的大小写不能出现问题,Java是大小写很敏感的

  2. 尽量使用英文;

  3. 文件名和类名必须一致,并且首字母大写

  4. 符号使用的是中文错误

 

数据类型拓展:

 //整数拓展    进制    二进制0b     十进制     八进制0      十六进制0x
 ?
 public class HelloWord{
   public static void main(String[] args){
     
     int i = 10;
     int i1 = 010;八进制0
     int i2 = 0x10;十六进制0x  0~9 A~F 16
     
     System.out.println(i);//10
     System.out.println(i1));//8
     System.out.println(i2);//16
   }
 }
 ?
 //浮点数拓展   银行管理  : BigDecimal
 //float     有线  离散  舍入误差  大约  接近但不等于  
 //double
 //最好完全使用浮点数进行比较 ***
 ?
     float f = 0.1f;//0.1
     double d = 1.0/10;//0.1
     
     System.out.println(f==d);//false
     
     float d1 = 321312312;
     float d2 = d1+1;
 ?
     System.out.println(f==d);//true
 ?
 //字符拓展
     char a = 'a';
     char b = '中';
 ?
     System.out.println(a);//a
     System.out.println((int)a);//强制转换  97
 ?
     System.out.println(b);//中
     System.out.println((int)b);//强制转换  20013
 //所有的字符本质还是数字
 //编码  Unicode  2字节  0 - 65536  Excel  2^16 = 65536
 ?
     //U0000  UFFFF
     char c = '\u0061';
     System.out.println(c);//a
 ?
 //转义字符
 //  \t  制表符
 //  \n  换行
 System.out.println("Hello\tWord");
 ?
         String sa = new String("hello word");
         String sb = new String("hello word");
 ?
         System.out.println(sa==sb);
 ?
         String sc = "hello word";
         String sd = "hello word";
 ?
         System.out.println(sc==sd);
         //对象  从内存分析
 ?
         //布尔值扩展
         boolean flag = true;
         if (flag==true){}   //新手
         if (flag){}     //老手
         //Less is  More  代码要精简易读

类型转换

 public class Demo {
     public static void main(String[] args) {
         int i =128;
         byte b = (byte) i;//内存溢出
 ?
         //强制转换  (类型)变量名     高->低
 ?
         System.out.println(i);
         System.out.println(b);
         /*
         注意点:
         1.不能对布尔值进行转换
         2.不能把对象类型变为不相干的类型
         3.在把高容量转换为低容量的时候,强制转换
         4.转换的时候可能存在内存溢出,或者精度问题!
          */
 ?
         //操作数比较大的时候,注意溢出问题
         //JDK7新特性,数字之间可以用下划线分割
         int money = 10_0000_0000;
         int years = 20;
         int total = money*years;// -1474836480, 计算的时候溢出了
         int total1 = money*years;//默认是int,转换之前已经存在问题了
 ?
         int total2 = (int) (money*((long)years));//先把一个数转换为Long
         System.out.println(total2);
 ?
 ?
 ?
     }
 }

变量

 public class Demo {
 ?
     //类变量   static
     static double salary = 2500;
     //属性 :变量
 ?
     //实例变量:从属于对象;如果不自进行初始化,这个类型的默认值 0 0.0
     //布尔值:false
     //除了数据类型,其他的默认值都是null
     String name;
     int age;
 ?
     //main方法
     public static void main(String[] args) {
 ?
         //局部变量 :必须声明和初始化值
         int i = 10;
         System.out.println(i);
 ?
         //变量类型  变量名字 = new Demo();
         Demo demo = new Demo();
         System.out.println(demo.age);
         System.out.println(demo.name);
 ?
         //类变量  static
         System.out.println(salary);
     }
     //其他方法
     public void add(){
 ?
     }
 }

常量:final

 public class Demo {
 ?
     //修饰符,不存在先后顺序
     static final double PI = 3.14;
 ?
     public static void main(String[] args) {
         System.out.println(PI);
     }
 ?
 }

 

Java变量命名规则为:

1、Java变量命名只能使用字母、数字、下划线、美元符号($)组成。

2、变量名以字母、下划线或者美元符号开头,其中以美元符号开头命名的变量虽然能够编译通过但是不建议使用。

3、变量的名字可大小写混用,但首字符应小写。

4、Java变量名不限制长度,在命名的时候,尽量使用完整的单词进行命名,不要使用缩写。

5、变量名不可以和java关键字冲突,但是可以包含关键字。

 

运算符 优先级:()

:long以下的都会为int,long以上的都为最高那个

一元运算符

 public class Demo {
 ?
     public static void main(String[] args) {
 ?
         //++  --    自增,自减  一元运算符
         int a = 3;
 ?
         int b = a++;//执行完这行代码后,先给b赋值,在自增
         //a = a+1;
         System.out.println(a);
         //a = a+1;
 ?
         int c = ++a;//执行完这行代码后,先自增,再给b赋值
 ?
 ?
         //幂运算 2^3  2*2*2 =8 很多运算,我们会使用一些工具类来操作!
 ?
         double pow = Math.pow(3, 2);
         System.out.println(pow);
     }
 ?
 }

位运算符

 public class Demo {
 ?
     public static void main(String[] args) {
 ?
         /*
         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);
     }
 ?
 }

赋值运算符

 public class Demo {
 ?
     public static void main(String[] args) {
         int a = 10;
         int b = 20;
         a+=b;//a=a+b
         a-=b;//a=a-b
 ?
         System.out.println(a);
         //字符串连接符    + ,String
         System.out.println(""+a+b);//1020
         System.out.println(a+b+"");//30
     }
 ?
 }

条件运算符

 public class Demo {
     
     public static void main(String[] args) {
         //x ? y : z
         //如果x==true,则结果为y,否则为z
 ?
         int score = 80;
         String type = score < 60 ?"不及格":"及格";
         System.out.println(type);
     }
 }

包机制

包机制:一般利用公司域名倒置作为包名;

JavaDoc

命令:javadoc -encoding UTF-8 -charset UTF-8 Doc.java

可以直接写成:javadoc Doc.java

 

Scanner:用户交互

 

next( ):

  1. 一定要读取到有效字符后才可以结束输入

  2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉

  3. 只有输入有效字符后才将其后面的空白作为分隔符或者结束符

  4. next()不能得到带有空格的字符串

nextLine():

  1. 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符

  2. 可以获得空白

实例:

 public class Demo {
 ?
     public static void main(String[] args) {
 ?
         //创建一个扫描器对象,用于接收键盘数据
         Scanner scanner = new Scanner(System.in);
         System.out.println("使用next方式接收:");
 ?
         //判断用户有没有输入字符串
         if (scanner.hasNext()){
             String next = scanner.next();//程序会等待用户输入完毕
             System.out.println("输入的内容为:"+next);//hello
         }
         //凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关
         scanner.close();
     }
 }
 public class Demo {
 ?
     public static void main(String[] args) {
 ?
         //接收键盘数据
         Scanner scanner = new Scanner(System.in);
         System.out.println("使用nextLine方式接收:");
 ?
         //判断是否还有输入
         if (scanner.hasNextLine()){
             String next = scanner.nextLine();//程序会等待用户输入完毕
             System.out.println("输入的内容为:"+next);//hello word
         }
         scanner.close();
     }
 }

Scanner进阶:

 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 = scanner.nextDouble();
             m++;
             sum += x;
             System.out.println("你输入了第"+m+"个数据,然后当前的结果sum="+sum);
         }
         System.out.println(m+"个数的和为"+sum);
         System.out.println(m+"个数的平均值是"+(sum/m));
 ?
         scanner.close();
     }
 }

循环

if

 public class Demo {
 ?
     public static void main(String[] args) { 
       if(表达式){
         A:如果表达式的值是真的,就会执行语句A,否则不执行
       }
     }
 }

 

switch

switch循环

使用方法:一般用来做分支的,或者进行选择

 public class Demo {
 ?
     public static void main(String[] args) {
         String name = "秦疆";
         switch (name){
             case "秦疆":
                 System.out.println("秦疆");
                 break;
             case "狂神":
                 System.out.println("狂神");
                 break;
         }
     }
 }

while

while循环

使用方法:先判断,在执行;当条件表达式成立时,则执行循环体,然后在进行判断,如果条件不成立时,有可能不执行。一般用于循环次数不确定的循环

 int i=0;
   int sum=0;
   while (i<100){
   if (i%3==0) {
    sum+=i;
            }
    i++;
  }
   System.out.println("100以内的能被3整除之数的和为"+sum);

 

do-while

do..while循环

使用方法:先执行,后判断;一般用于循环次数不确定的循环,与while循环不同的是先执行后判断,至少会执行一次。

 int j=1;
   int sum2=0;
   do {
    if (j%5==0&&(j%7==0)) 
     sum2 +=j;
     j++;
   } while (j<=100);
   
   System.out.println("100以内即能被5整除又能被7整除数的和"+sum2);

 

for

for循环(已知循环多少次)

使用方法:先判断,在执行;如果循环次数确定,那么一般用for循环

for循环是最有效,最灵活的循环结构

 int sum=0;
  
    for (int i = 0; i < 100; i++) {
 sum +=i+1;
        }
     System.out.println("100以内的和为:"+sum);

break

:用于强制退出循环

continue

:用于终止某次循环过程

goto关键字

 public class Demo {
 ?
     public static void main(String[] args) {
 ?
         //打印101-105之间所有的质数
         //质数是指在大于1的自然数中,除了1和他本身不会再有其他因数的自然数
         //不建议使用!了解即可的一个玩法
         int count = 0;
         outer:for (int i = 101; i < 150; i++) {
             for (int j = 2; j < i/2; j++) {
                 if (i % j==0){
                     continue outer;
                 }
             }
             System.out.println(i+"");
         }
     }
 }

方法

重载(overloading): 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

方法重载的规则:

  • 方法名称必须相同

  • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)

  • 方法的返回类型可以相同也可以不同

  • 仅仅返回类型不同不足以成为方法的重载

  • 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器会报错

重写:是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

可变参数

  • JDK1.5开始,Java支持传递同类型的可变参数给一个方法

  • 在方法声明中,在指定参数类型后加一个省略号(…)

  • 一个方法中只能指定一个可变参数,他必须是方法的最后一个参数。任何普通的参数必须在他之前声明

实例:

 public class Demo {
 ?
     public static void main(String[] args) {
         printMax(12,43,65,232,22);
         printMax(new double[]{1,2,3,4,5});
 ?
     }
     public static void printMax(double... numbers){
 ?
         if (numbers.length==0){
             System.out.println("No argument passed");
             return;
         }
         double result = numbers[0];
 ?
         //排序
         for (int i = 1; i < numbers.length; i++) {
             if (numbers[i]>result){
                 result = numbers[i];
             }
         }
         System.out.println("The Max value is"+result);
     }
 }

递归

:简单来说就是自己调用自己

递归结构包括两部分:

递归头:什么时候不调用自生方法。如果没有头,将陷入死循环。

递归体:什么时候需要调用自身方法。

实例:看代码

 //递归
 public class Demo {
 //递归思想
     //阶乘
     //5! 5*4*3*2*1
     public static void main(String[] args) {
         System.out.println(f(5));
     }
     public static int f(int n){
         if (n==1){
             return 1;
         }else {
             return n *f(n-1);
         }
     }
 }

数组(Array):

 public class Demo {
 ?
         //变量的类型     变量的名字   =   变量的值
         //数组类型
         public static void main(String[] args) {
             int[] nums ;//1.声明一个数组
             nums = new int[3];//创建一个数组
 ?
             //3.给数组元素中赋值    数组下标从0开始
             nums[0]=1;
             nums[1]=2;
             nums[2]=3;
 ?
             int sum = 0;//计算所有元素的和
 ?
             //获得数组长度: array.length
             for (int i = 0; i < nums.length; i++) {
                 sum = sum +nums[i];
             }
             System.out.println("总和为:"+sum);
         }
 ?
 }

数组初始化:

 public class Demo {
 ?
     public static void main(String[] args) {
         //静态初始化 :创建 + 赋值
         int[] a = {1,2,3,4};
         System.out.println(a[1]);
 ?
         //动态初始化
         int[] b = new int[10];
         b[2] = 10;
         System.out.println(b[2]);
         System.out.println(b[3]);//     0 默认值
         //System.out.println(b[10]);   // ArrayIndexOutOfBoundsException  : 数组下标越界异常
 ?
     }
 }

数组的四个基本特点:

  • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

  • 其元素必须是想同类型,不允许出现混合类型。

  • 数组中的元素可以使任何数据类型,包括基本类型和引用类型。

  • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的

数组总结:

  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合

  • 数组也是对象。数组元素相当于对象的成员变量

  • 数组长度是确定的。不可变的。如果越界,则报:ArrayIndexOutOfBoundsException

进阶方法:

 public class Demo {
 ?
     public static void main(String[] args) {
         int[] arrays = {1,2,3,4,5};
 //        //JDK1.5,没有下标
 //        for (int array : arrays) {
 //            System.out.println(array);
 //        }
         int[] reverse = reverse(arrays);
         printArray(reverse);
 ?
     }
     public static int[] reverse(int[] arrays){
         int[] result =  new int[arrays.length];
 ?
         //反转的操作
         for (int i = 0,j= result.length-1; i < arrays.length; i++,j--) {
             result[j] = arrays[i];
         }
         return result;
     }
     //打印数组元素
     public static void printArray(int[] arrays){
         for (int i = 0; i < arrays.length; i++) {
             System.out.print(arrays[i]+" ");
         }
     }
 }

二维数组:

 public class Demo {
 ?
     public static void main(String[] args) {
         //[4][2]
         /*
         1,2     array[0]
         2,3     array[1]
         3,4     array[2]
         4,5     array[3]
          */
         int[][] array = {{1,2},{2,3},{3,4},{4,5}};
         for (int i = 0; i < array.length; i++) {
             for (int j = 0; j < array[i].length; j++) {
                 System.out.println(array[i][j]);
             }
         }
         printArray(array[0]);
     }
     
     //打印数组元素
     public static void printArray(int[] arrays){
         for (int i = 0; i < arrays.length; i++) {
             System.out.print(arrays[i]+" ");
         }
     }
 }

Arrays类:

 public class Demo {
 ?
     public static void main(String[] args) {
 ?
         int[] a = {1, 4, 3, 6, 7};
         //打印数组元素    Arrays.toString()
         System.out.println(Arrays.toString(a));
 ?
         Arrays.sort(a);//对数组进行排序
         System.out.println(Arrays.toString(a));
 ?
         //填充   formIndex: 起始下标 toIndex: 结束下标
         Arrays.fill(a,2,4,0);
         System.out.println(Arrays.toString(a));
     }
 ?
     //打印数组元素
     public static void printArray(int[] a){
         for (int i = 0; i < a.length; i++) {
             System.out.print(a[i]+" ");
         }
     

冒泡排序

时间复杂度:O(n2)

思路:

这里可以理解为如果有两杯子水一杯水是红色(A)的一杯水是蓝色(B)的,我们要交换这两杯水,这个时候我们就需要一个容器temp,我们要把A先导入容器中然后把B导入A,接着把容器中的水导入B。

 public class Demo {
 ?
     //1.比较数组中,两个相邻的元素,如果选出一个数比第二个数大,就交换他们的位置
     //2.每一次比较,都会产生出一个最大,或者最小的数字;
     //3.下一轮则可以少一次排序
     //4.依次循环直到结束!
 ?
     public static void main(String[] args) {
         int[] a = {1,54,76,34,98,332};
 ?
         int[] sort = sort(a);//调用完我们自己写的排序方法以后,返回一个排序后的数组
         System.out.println(Arrays.toString(sort));
 ?
 ?
     }
     public static int[] sort(int[] array){
         //临时变量
         int temp = 0;
 ?
         //外层循环,判断要循环多少次
         for (int i = 0; i < array.length-1; i++) {
             //内层循环,判断两个数,如果第一个数比第二个数大,则交换位置
             for (int j = 0; j < array.length - 1 - i; j++) {
                 if (array[j+1]>array[j]){//更改这里可以从小到到大<
                     temp = array[j];
                     array[j] = array[j+1];
                     array[j+1] = temp;
                 }
             }
         }
         return array;
     }
 }

冒泡排序的优化:

为什么要优化?

如果内部排序已经是好的了,可以节约时间成本

     public static int[] sort(int[] array){
         //临时变量
         int temp = 0;
 ?
         //外层循环,判断要循环多少次
         for (int i = 0; i < array.length-1; i++) {
 ?
             boolean flag = false;//通过flag标志位减少没有意义的比较
 ?
             //内层循环,判断两个数,如果第一个数比第二个数大,则交换位置
             for (int j = 0; j < array.length - 1 - i; j++) {
                 if (array[j+1]>array[j]){//更改这里可以从小到到大<
                     temp = array[j];
                     array[j] = array[j+1];
                     array[j+1] = temp;
                     flag = true;//里面每循环一次flag为true
                 }
             }
             if (flag==false){//说明里面已将是排序好的所以跳出循环
                 break;
             }
 ?
         }
         return array;
     }
 }

稀疏数组

当一个数组中大部分元素为0,或者同一值的数组时,可以使用稀疏数组来保存该数组

稀疏数组的处理方式是:

  • 记录该数组一共有几行几列,有多少个不同值

  • 把具有不同值的元素和行列记录在一个小规模的数组中,从而缩小程序的规模

 public class Demo {
 ?
     public static void main(String[] args) {
         //模拟五子棋
         //1.创建一个二维数组 11 * 11    0:没有棋子  1:黑棋    2:白棋
         int[][] array = new int[11][11];
         array[1][2] = 1;
         array[2][3] = 2;
         //输出原始的数组
         System.out.println("输出原始的数组");
         for (int[] ints : array) {
             for (int anInt : ints) {
                 System.out.print(anInt+"\t");
             }
             System.out.println();
         }
         //转换为稀疏数组
         //获取有效值的个数
         int sum = 0 ;
         for (int i = 0; i < 11; i++) {
             for (int j = 0; j < 11; j++) {
                 if (array[i][j]!=0){
                     sum++;
                 }
             }
         }
         System.out.println("有效值的个数"+sum);
 ?
         int[][] array1 = new int[sum+1][3];//这里的sum+1代表行,有效值的个数加一       3代表列
 ?
         array1[0][0] = 11;//存了多少行
         array1[0][1] = 11;//存了多少列
         array1[0][2] = sum;//几个有效的值
 ?
         //遍历二维数组,将非零的值,存放在稀疏数组中
         int count = 0;
         for (int i = 0; i < array.length; i++) {
             for (int j = 0; j < array[i].length; j++) {
                 if (array[i][j]!=0){
                     count++;
                     array1[count][0] =i;//第几行的第0个数字存他的横坐标
                     array1[count][1] =j;//第几行的第1个数字存他的纵坐标
                     array1[count][2] =array[i][j];//值
                 }
             }
         }
         //输出稀疏数组
         System.out.println("稀疏数组");
 ?
         for (int i = 0; i < array1.length; i++) {
             System.out.println(array1[i][0]+ "\t"
                     +array1[i][1]+ "\t"
                     +array1[i][2]+ "\t");
         }
         System.out.println("==============");
         System.out.println("还原" );
         //1,读取稀疏数组
         int[][] array2 = new int[array1[0][0]][array1[0][1]];
 ?
         //2.给其中的元素还原它的值
         for (int i = 1; i < array1.length; i++) {
             array2[array1[i][0]][array1[i][1]] = array1[i][2];
         }
         //3.打印
         System.out.println("输出还原的数组");
 ?
         for (int[] ints : array2) {
             for (int anInt : ints) {
                 System.out.print(anInt+"\t");
             }
             System.out.println();
         }
     }
 }

面向对象

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

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

  • 抽象

三大特性:

  • 封装

  • 继承

  • 多态

关于static他是和类一起加载的而之后的方法是类实例化之后才存在的

看代码

 public class A{
   public static void main(String[] args){
     
   }
   public static  void a(){}//和类一起加载的
   public void b(){}//类实例化之后才存在的
 }

实际参数和形式参数的类型要一一对应

值传递

 //值传递
 public class Demo {
 ?
     public static void main(String[] args) {
         int a = 1;
         System.out.println(a);
         Demo.change(a);
         System.out.println(a);
     }
     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);
 ?
     }
     public static void change(Person person){
         //person是一个对象:指向了--->Person person = new Person();这是一个具体的人,可以改变属性!
         person.name = "秦疆";
     }
 }
 class Person{
     String name;
 }

一个项目只存在一个main方法

super注意点

  1. super调用父类的构造方法,必须在构造方法的第一个

  2. super必须只能出现在子类的方法或者构造方法中!

  3. super 和 this 不能同时调用构造方法!

Vs this

代表的对象不同:

  • this:本身调用这个对象

  • super:代表父类对象的应用

    • 前提

  • this:没有继承也可以使用

  • super:只能在继承条件下才可以使用

    • 构造方法

  • this():本身的构造

  • super():父类的构造!

重写:需要有继承关系,子类重写父类的方法!

  1. 方法名必须相同

  2. 参数列表必须相同

  3. 修饰符:范围可以扩大但不能缩小 :public>Protected>Default>private

  4. 抛出的异常:范围,可以被缩小,但不能扩大

重写,子类的方法和父类必要一致:方法体相同!

为什么需要重写:

1.父类的功能子类不一定需要,或者不一定满足!

 

多态注意事项:

  1. 多态是方法的多态,属性没有多态

  2. 父类和子类,有联系 类型转换异常! ClassCastExpection!

  3. 存在条件:继承条件,方法需要重写,父类引用指向子类引用!

  • static 方法,属于类,他不属于实例

  • final常量

  • private方法

类型转换

  1. 父类引用指向子类的对象

  2. 把子类转换为父类,向上转型

  3. 把父类转换为子类,向下转型,强制转换

  4. 方便方法的调用,减少重复的代码!简洁

抽象: 封装、继承、多态

instanceof:检测某个对象是不是另一个对象的实例

static

 public class Demo {
 ?
     {       //  2   赋初始值
         System.out.println("匿名代码块");
     }
     static {    // 1 只执行一次~
         System.out.println("静态代码块");
     }
 ?
     public Demo() { //  3
         System.out.println("构造方法");
     }
 ?
     public static void main(String[] args) {
         Demo demo = new Demo();
         System.out.println("=====");
         Demo demo1 = new Demo();
     }
 }

还可以静态导入包在import后面加static关键字

抽象类

 //abstract  抽象类:类   extends:单继承~    (接口可以多继承)
 public abstract class Demo {
 ?
     //约束~有人帮我们实现~
     //abstract,抽象方法,只有方法名字,没有方法的实现!
     public abstract void something();
 ?
     //1.不能new这个抽象类,只能靠子类去实现他,约束!
     //2.抽象类可以写普通的方法~
     //3.抽象方法只能在抽象类中~
     //抽象的抽象:约束~
 }
 //抽象类的所有方法,继承了他的子类,都必须要实现他的方法~除非子类也是抽象类
 public class A extends Demo {
     @Override
     public void something() {
 ?
     }
 }

接口

  • interface定义 使用implements实现

  • 接口可以实现多继承

  • 接口中的所有定义的方法其实都是抽象的 默认都是: public abstract

  • 常量的定义 默认都是:public static final

  • 接口不能被实例化~接口中没有构造方法

  • 必须重写接口中的方法

  • 约束

类Class

一个java类中可以有多个class类,但只能有一个public class

异常

  • Throwable:这个是最大的异常

  • Throwable分为Exception与Error

  • Exception:这是我们的问题可以解决

  • Error:这是JVM或者底层的一些问题我们不需要管

  • 要捕获多个异常需要从小到大

  • throw可以主动抛出一个异常

  • 在方法上抛出一个异常就是throws

异常处理

 //自定义的异常类
 public  class MyExpection extends Exception{
 ?
     //传递数字>10
     private int detail;
 ?
     public MyExpection(int a) {
         this.detail = a;
     }
     //tostring:异常信息的打印
 ?
     @Override
     public String toString() {
         return "MyExpection{" +
                 "detail=" + detail +
                 '}';
     }
 }
 public class Test {
 ?
     //可能存在异常的方法
     static void test(int a) throws MyExpection {
         System.out.println("传递的参数为:"+a);
         if (a>10){
                 throw new MyExpection(a);//抛出
         }
         System.out.println("ok");
     }
 ?
     public static void main(String[] args) {
         try {
             test(11);
         } catch (MyExpection e) {
             System.out.println("MyExpection=>"+e);
         }
     }
 }