学而时习之---Java基础

2017-09-18  本文已影响0人  狼牙战士
   * 对象
    * 类
    * 成员方法
    * 构造方法
    * 常量
    * 变量:局部变量、类变量(静态变量)、成员变量
    * Java大小写敏感,类名首字母大写,方法名首字母小写,源文件名与类名相同,主方法口:public static void main(String []args)
    * Java标识符:以字母 $ _ 开头,首字符之后可以是字母 $ _ 数字
    * 访问控制符:public protected default private
    * 修饰符:static final abstract synchronized transient volatile
    * 八种基本数据类型:byte short int long float double boolean char
    * 类型转换
    * 算术运算符: + - * / % ++ --
    * 关系运算符: ==  !=  >  <  >=  <=
    * 逻辑运算符:&&  ||  !
    * 位运算符
    * 赋值运算符:=  +=  -=  *=  /=  %=  等
    * 三元运算符:c = a>b ? d : e
    * 循环结构:while循环    do...while循环    for循环
    * 分支结构:if语句  switch语句
    * Number类 Math类 Character类 String类 StringBuffer类  Scanner类
    * Java异常处理
    * Java继承
    * Java Override/Overload
    * Java多态
    * Java抽象类
    * Java封装
    * Java接口
    * Java package
    * Java 网络编程
    * Java多线程
    * Java数据结构
    * 迭代器

1.类和对象

package test;
/*
 * Java对象和类:
 *      对象:对象是类的一个实例,有状态和行为。
 *      类:类是一个模板,描述一类对象的行为和状态。
 * Java中的类
 *      类包含以下类型变量:
 *          局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
 *          成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
 *          类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
 * 构造方法:每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
 * 创建对象:
 *      声明:声明一个对象,包括对象名称和对象类型。
 *      实例化:使用关键字new来创建一个对象。
 *      初始化:使用new创建对象时,会调用构造方法初始化对象。
 * */
public class Test {
    //两个成员变量
    int age;
    String sex;
    
    //两个构造方法:一个不带参数,一个带参数
    public Test(){
        System.out.println("构造方法一!");
    }
    public Test(String name){
        System.out.println("构造方法二:" + name);
    }
    //定义一个方法
    public void huhu(){
        int h = 11;//定义一个局部变量
        System.out.println("调用方法,局部变量值:"+h);
    }
    
    public static void main(String []args){
        //下面两个对象在创建的时候使用了不同的构造方法
        
        Test myTest = new Test();//创建一个myTest对象
        myTest.age = 11;//给对象的属性设定值
        myTest.sex = "男";
        myTest.huhu();//调用方法
        System.out.println("myTest的age和sex分别是:"+myTest.age+','+myTest.sex);//访问成员变量
        
        Test myTest2 = new Test("狗狗");
        myTest2.age = 13;
        myTest2.sex = "女";
        myTest2.huhu();//调用方法
        System.out.println("myTest2的age和sex分别是:"+myTest2.age+','+myTest2.sex);//访问成员变量
    }
}

Snip20170918_1.png

2.java基本数据类型

/*
 *Java基本数据类型
 *  byte:有符号整数,一个字节,(-2^7 ~ 2^7-1)
 *  short:有符号整数,两个字节,(-2^15 ~ 2^15-1)
 *  int:有符号整数,四个字节,(-2^31 ~ 2^31-1)
 *  long:有符号整数,八个字节,(-2^63 ~ 2^63-1)
 *  float:单精度浮点数,四个字节
 *  double:双精度浮点数,八个字节
 *  boolean:true/false
 *  char:两个字节
 *Java 中使用 final 关键字来修饰常量
 * */
public class Test {
    
    public static void main(String []args){
        System.out.println("基本类型:byte,short,int,long,float,double,char的位数:"+Byte.SIZE+','+Short.SIZE+','+Integer.SIZE+','+Long.SIZE+','+Float.SIZE+','+Double.SIZE+','+Character.SIZE);
        final double PI = 3.1415927;
        System.out.println("常量PI的值:"+PI);
    }
}
Snip20170918_3.png

3.Java变量类型

/*
 *Java变量
 *  声明变量的基本格式:type identifier = value;
 *  变量类型:
 *      类变量:独立于方法之外的变量,用 static 修饰。
 *          类变量也称为静态变量,在类中以static关键字声明,但必须在方法构造方法和语句块之外。
 *          无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
 *          静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
 *          静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
 *          静态变量在程序开始时创建,在程序结束时销毁。
 *          与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。
 *          默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
 *          静态变量可以通过:ClassName.VariableName的方式访问。
 *          类变量被声明为public static final类型时,类变量名称一般建议使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。
 *      实例变量:独立于方法之外的变量,不过没有 static 修饰。
 *          实例变量声明在一个类中,但在方法、构造方法和语句块之外;
 *          当一个对象被实例化之后,每个实例变量的值就跟着确定;
 *          实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
 *          实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
 *          实例变量可以声明在使用前或者使用后;
 *          访问修饰符可以修饰实例变量;
 *          实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
 *          实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
 *          实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
 *      局部变量:类的方法中的变量。
 *          局部变量声明在方法、构造方法或者语句块中;
 *          局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
 *          访问修饰符不能用于局部变量;
 *          局部变量只在声明它的方法、构造方法或者语句块中可见;
 *          局部变量是在栈上分配的。
 *          局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
 *          
 * */
public class Test {
    static int age ;//类变量
    String sex;//实例变量
    
    public void pup(){
        int a = 0;//局部变量
        a = a + 7;
        System.out.println("局部变量a的值:"+a);
    }
    
    public static void main(String []args){
        Test test = new Test();
        age = 10;
        test.sex = "男";
        System.out.println("类变量age的值:"+age+"成员变量sex的值:"+test.sex);
        test.pup();
    }
}
Snip20170918_4.png

4.Java修饰符

/*
 *Java修饰符
 *  访问控制修饰符
 *      default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
 *      private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
 *      public : 对所有类可见。使用对象:类、接口、变量、方法
 *      protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
 *  非访问修饰符
 *      static 修饰符,用来修饰类方法和类变量。
 *          静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。
 *          静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。
 *      final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
 *      abstract 修饰符,用来创建抽象类和抽象方法。
 *      synchronized 和 volatile 修饰符,主要用于线程的编程。
 *          
 * */

5.Java运算符

/*
 *Java运算符
 *      算术运算符
 *          + - *  /  % ++ --
 *      关系运算符
 *          ==  !=  >  <  >=  <=
 *      位运算符
 *          &  |  ^  ~  <<  >>  >>>
 *      逻辑运算符
 *          &&(逻辑与)  ||(逻辑或)  !(逻辑非)
 *      赋值运算符
 *          =  +=  -=  *=  /=  
 *      其他运算符
 *          三元运算符:variable x = (expression) ? value if true : value if false
 *          instanceof运算符:检查该对象是否是一个特定类型
 *          
 * */

6.Java循环

/*
 *Java循环结构
 *      while
 *      do...while
 *      for 
 *  break关键字    主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
 *  continue关键字  适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
 * */
public class Test {
    
    public static void main(String []args){
        
        //while循环
        int x = 0;
        while(x < 10){
            if(x == 5){
                break;//结束循环
            }
            System.out.println("value of x :"+x);
            x++;
        }
        //do...while循环
        System.out.println();
        int y = 1;
        do{
            System.out.println("value of y :"+y);
            y++;
        }while(y<5);
        //for循环
        System.out.println();
        for(int i = 0; i<5; i++){
            if(i == 3){
                continue;//结束本次循环,继续循环
            }
            System.out.println("value of i :"+i);
        }
        //增强for循环
        String [] names = {"a", "b", "c", "d", "e"};
        for(String name: names){
            System.out.println(name);
        }
    }
}
Snip20170918_5.png

7.Java分支结构

/*
*Java分支结构
*  if语句
*  switch语句
* */
public class Test {
   
   public static void main(String []args){
       
       int x = 30;
       if(x == 10){
           System.out.println("value of x is 10");
       }else if(x == 20){
           System.out.println("value of x is 20");
       }else if(x == 30){
           System.out.println("value of x is 30");
       }else{
           System.out.println("这是 else 语句");
       }
       
       char grade = 'C';
       switch(grade){
       case 'A':
           System.out.println("优秀");
           break;
       case 'B':
           System.out.println("良好");
           break;
       case 'C':
           System.out.println("及格");
           break;
       case 'D':
           System.out.println("不及格");
           break;
       default:
           System.out.println("未知等级");
       }
   }
}
Snip20170918_6.png

8.Java Number & Math 类

/*
 *Java Number & Math 类
 *  Number & Math 类方法
 *      xxxValue():将 Number 对象转换为xxx数据类型的值并返回  byteValue()  doubleValue() floatValue() intValue() longValue() shortValue()
 *      compareTo():将number对象与参数比较。两个不同类型的数据不能用此方法来比较
 *      equals():判断number对象是否与参数相等。
 *      valueOf():返回一个 Number 对象指定的内置数据类型
 *      toString():以字符串形式返回值。
 *      parseInt():将字符串解析为int类型。
 *      abs():返回参数的绝对值。
 *      ceil():对整形变量向左取整,返回类型为double型。对一个数进行上舍入,返回值大于或等于给定的参数
 *      floor():对整型变量向右取整。返回类型为double类型,小于或等给定的参数
 *      rint():返回与参数最接近的整数。返回类型为double。
 *      round():返回一个最接近的int、long型值。
 *      min():返回两个参数中的最小值。
 *      max():返回两个参数中的最大值。
 *      exp():返回自然数底数e的参数次方。
 *      log():返回参数的自然数底数的对数值。
 *      pow():返回第一个参数的第二个参数次方。
 *      sqrt():求参数的算术平方根。
 *      sin():求指定double类型参数的正弦值。
 *      cos():求指定double类型参数的余弦值。
 *      tan():求指定double类型参数的正切值。
 *      asin():求指定double类型参数的反正弦值。
 *      acos():求指定double类型参数的反余弦值。
 *      atan():求指定double类型参数的反正切值。
 *      atan2():将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。
 *      toDegrees():将参数转化为角度。
 *      toRadians():将角度转换为弧度。
 *      random():返回一个随机数。
 * */
public class Test {
    
    public static void main(String []args){
        Integer x = 5;
        System.out.println(x.doubleValue());//返回double原生数据类型
        System.out.println(x.compareTo(3));//相等返回0,小于返回-1,大于返回1.
        Integer y = 5;
        System.out.println(x.equals(y));//与方法的参数类型与数值都相等返回 True,否则返回 False。
        System.out.println(Float.valueOf("80"));//参数为 Integer 对象的整数或者字符串
        System.out.println(x.toString());
        System.out.println(Double.parseDouble("5"));
        System.out.println(Math.abs(-6));//返回参数的绝对值
        System.out.println(Math.ceil(3.43));
        System.out.println(Math.ceil(-3.43));//参数为double 或 float
        System.out.println(Math.floor(4.6));
        System.out.println(Math.floor(-4.6));//返回 double 类型数组,小于或等于给定的参数
        System.out.println(Math.rint(100.6));
        System.out.println(Math.rint(100.5));//返回 double 类型数组,是最接近参数的整数值
        System.out.println(Math.round(100.6));
        System.out.println(Math.round(100.5));//参数为double,float,返回一个最接近的int、long型值
        System.out.println(Math.min(12.3, 12.4));
        System.out.println(Math.max(12.3, 12.4));
        System.out.println(Math.exp(2));//返回自然数底数e的2次方
        System.out.println(Math.log(7.38905609893065));//返回参数的自然数底数的对数值。
        System.out.println(Math.pow(3, 3));//返回第一个参数的第二个参数次方。
        System.out.println(Math.sqrt(4));//返回参数的算术平方根。
        System.out.println(Math.random());//用于返回一个随机数,随机数范围为 0.0 =< Math.random < 1.0。
        
    }
}
Snip20170919_7.png

9.Java Character类

/*
 *Java Character类
 *  Character 类用于对单个字符进行操作,Character 类在对象中包装一个基本类型 char 的值
 *  Character方法
 *      isLetter():是否是一个字母
 *      isDigit():是否是一个数字字符
 *      isWhitespace():是否是一个空格
 *      isUpperCase():是否是大写字母
 *      isLowerCase():是否是小写字母
 *      toUpperCase():指定字母的大写形式
 *      toLowerCase():指定字母的小写形式
 *      toString():返回字符的字符串形式,字符串的长度仅为1
 * */
public class Test {
    
    public static void main(String []args){
        System.out.println(Character.isLetter('c'));
        System.out.println(Character.isLetter('5'));
        System.out.println();
        System.out.println(Character.isDigit('c'));
        System.out.println(Character.isDigit('5'));
        System.out.println();
        System.out.println(Character.isWhitespace('c'));
        System.out.println(Character.isWhitespace(' '));
        System.out.println(Character.isWhitespace('\n'));
        System.out.println(Character.isWhitespace('\t'));
        System.out.println();
        System.out.println( Character.isUpperCase('c'));
        System.out.println( Character.isUpperCase('C'));
        System.out.println();
        System.out.println( Character.isLowerCase('c'));
        System.out.println( Character.isLowerCase('C'));
        System.out.println();
        System.out.println(Character.toUpperCase('a'));
        System.out.println();
        System.out.println(Character.toLowerCase('A'));
        System.out.println();
        System.out.println(Character.toString('a'));
    }
}
Snip20170919_8.png

10.Java数组

/*
 *Java数组 用来存储固定大小的同类型元素。
 * */
public class Test {
    
    public static void main(String []args){
        int[] myList = new int[5];//创建数组
        myList[0] = 0;
        myList[1] = 1;
        myList[2] = 2;
        myList[3] = 3;
        myList[4] = 4;
        
        int total = 0;
        for(int i = 0; i < myList.length; i++){
            total += myList[i];
        }
        System.out.println("总和为:"+total);
        
        double[] myList2 = {1.1, 2.2, 3.3, 4.4, 5.5};//创建数组
        for(double element: myList2){//遍历数组
            System.out.println(element);
        }
        
        String s[][] = new String[2][];//二维数组
        s[0] = new String[2];
        s[1] = new String[3];
        s[0][0] = new String("Good");
        s[0][1] = new String("Luck");
        s[1][0] = new String("to");
        s[1][1] = new String("you");
        s[1][2] = new String("!");
        for(String[] element: s){
            for(String ele: element){
                System.out.println(ele);
            }
        }
    }
}
Snip20170919_9.png

11.Java String类

/*
 *Java String 类 
 *  String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了
 *Java StringBuffer 和 StringBuilder 类
 *  和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
 * */
public class Test {
    
    public static void main(String []args){
        String site = "www.baidu.com";
        int len = site.length();//字符串长度
        System.out.println("网址长度:" + len);
        System.out.println(site.indexOf('b'));//字符b在site中的位置
        System.out.println(site.substring(4, 9));//子字符串
        System.out.println(site.toUpperCase());//大写
        
        float x = 1.1f;
        int y = 2;
        String z = "haha";
        String fs = String.format("x,y,z三个变量的值为: %f, %d, %s", x, y, z);//创建格式化字符串
        System.out.println(fs);
        
        StringBuffer sb = new StringBuffer("官网:");
        sb.append("www");
        sb.append(".baidu.com");
        System.out.println(sb);
    }
}
Snip20170919_10.png

12.Java方法

/*
 *Java 方法
 *      Java方法是语句的集合,它们在一起执行一个功能。
 *          方法是解决一类问题的步骤的有序组合
 *          方法包含于类或对象中
 *          方法在程序中被创建,在其他地方被引用
 *      一个方法的所有部分:修饰符 返回值类型 方法名(参数类型 参数名){方法体 return 返回值;}
 *          修饰符:可选,定义了该方法的访问类型。
 *          返回值类型:returnValueType或者void
 *          方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
 *          参数类型:参数是可选的。
 *          方法体:方法体包含具体的语句,定义该方法的功能。
 *      方法的重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
 *      变量作用域:变量的范围是程序中该变量可以被引用的部分。
 *      构造方法:当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。
 *      finalize()方法:它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。
 * */
public class Test {
    int age;
    //构造方法
    Test(int i){
        age = i;
    }
    public static void main(String []args){
        int i = 5;
        int j = 2;
        int k = max(i, j);
        System.out.println(i + " 和 " + j + " 比较,最大值是:" + k);
        
        double x = 5.5;
        double y = 6.6;
        double z = max(x,y);
        System.out.println(x + " 和 " + y + " 比较,最大值是:" + z);
        
        Test myTest = new Test(10);
        System.out.println(myTest.age);
        
        myTest = null;
        System.gc();//调用Java垃圾收集器
        
        
    }
    
    public static int max(int num1, int num2){
        int result;
        if(num1 > num2){
            result = num1;
        }else{
            result = num2;
        }
        
        return result;
    }
    
    //方法的重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
    public static double max(double num1, double num2){
        double result;
        if(num1 > num2){
            result = num1;
        }else{
            result = num2;
        }
        
        return result;
    }
    //指定在对象销毁时候要执行的操作。
    protected void finalize(){
        System.out.println("对象销毁");
    }
}
Snip20170919_11.png

13.Java异常处理

/*
 *Java异常处理
 * */
public class Test {
    public static void main(String []args){
        int a[] = new int[2];
        try{
           System.out.println("Access element three :" + a[3]);
        }catch(ArrayIndexOutOfBoundsException e){
           System.out.println("Exception thrown  :" + e);
        }
        finally{
           a[0] = 6;
           System.out.println("First element value: " +a[0]);
           System.out.println("The finally statement is executed");
        }
    }

}
Snip20170919_12.png

14.Java继承

/*
 *Java继承
 *  继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
 *  继承的特性:
 *      子类拥有父类非private的属性,方法。
 *      子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
 *      子类可以用自己的方式实现父类的方法。
 *      Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
 *      提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
 *  继承关键字:
 *      extends关键字:在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
 *      implements关键字:使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
 *      super与this关键字:
 *          super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
 *          this关键字:指向自己的引用
 *      final关键字:final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。
 * */
//父类
class Animal{
    protected int age;
    void go(){
        System.out.println("animal go:");
    }
}
//子类继承父类
class Dog extends Animal{
    void go(){
        //调用父类方法
        super.go();
    }
}

public class Test {
    public static void main(String []args){
        Dog dog = new Dog();
        dog.age = 10;
        System.out.println("age:"+dog.age);
        dog.go();
    }
}
Snip20170920_1.png

15.Java 重写(Override)与重载(Overload)

/*
 *Java 重写(Override)与重载(Overload)
 *  重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
 *      重写规则:
 *          参数列表必须完全与被重写方法的相同;
 *          返回类型必须完全与被重写方法的返回类型相同;
 *          访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
 *          父类的成员方法只能被它的子类重写。
 *          声明为final的方法不能被重写。
 *          声明为static的方法不能被重写,但是能够被再次声明。
 *          子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
 *          子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
 *          重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
 *          构造方法不能被重写。
 *          如果不能继承一个方法,则不能重写这个方法。
 *  重载:重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
 *      重载规则:
 *          被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
 *          被重载的方法可以改变返回类型;
 *          被重载的方法可以改变访问修饰符;
 *          被重载的方法可以声明新的或更广的检查异常;
 *          方法能够在同一个类中或者在一个子类中被重载。
 *          无法以返回值类型作为重载函数的区分标准。
 * */

16.Java多态

/*
 *Java 多态
 *   多态是同一个行为具有多个不同表现形式或形态的能力
 *  多态的优点:
 *      1. 消除类型之间的耦合关系
 *      2. 可替换性
 *      3. 可扩充性
 *      4. 接口性
 *      5. 灵活性
 *      6. 简化性
 *  多态存在的三个必要条件
 *      继承
 *      重写
 *      父类引用指向子类对象
 * */

class Animal{
    public void eat(){
        System.out.println("haha");
    }
}
class Cat extends Animal{
    public void eat(){
        System.out.println("吃鱼");
    }
}
public class Test {
    public static void main(String []args){
        Animal a = new Cat();
        a.eat();
    }
}
Snip20170920_2.png

17.


上一篇 下一篇

猜你喜欢

热点阅读