zoukankan      html  css  js  c++  java
  • Java基本语言篇

    本篇内容只需要认识、了解即可,请务必养成良好的编程风格

    java常用开发工具

    详见 http://m.biancheng.net/view/5637.html
    这里不再赘述

    语言基础

    代码注释

    与 c/c++ 相同

    单行注释 //
    多行注释 /**/ 
    

    注意:多行注释中可以嵌套单行注释,但是多行注释中不可以嵌套多行注释

    编码规范

    可读性第一
    每条语句单独占一行
    变量声明时注意初始化
    控制好空格的数量

    命名规范

    Java严格区分大小写
    ·类名:通常使用名词,第一个字母必须大写,后续单词首字母大写
    ·方法名:通常使用动词,第一个单词首字母小写,后续单词首字母大写
    ·变量:第一个单词首字母小写,后续单词首字母大写
    ·常量:所有字母均大写

    变量与常量

    标识符

    Java语言规定标识符由任意顺序的字母、_(下划线)、$、数字组成,并且第一个字符不能是数字,标识符不能是Java中的关键字(关键字在一般会自动变色,所有的关键字都是小写的
    Tips:中文标识符是非常不好的编码习惯,Java跨平台开发语言,当编译环境的字符编码发生改变后,中文标识符会形成乱码

    变量

    变量名必须是一个有效标识符,且变量名不能重复

    常量

    需要关键字final

    final 数据类型 常量名称[=值]
    

    基本数据类型

    基本同c/c++,这里只介绍不同点和注意点
    1、Java中新增了byte类型
    2、c/c++ 中long long在Java中只需写long
    注意:Java的默认整数类型是int,为作出区分,long类型的整数末尾要加L或l

    long a = 123456789 * 987654321 //错误
    long a = 123456789L * 987654321L //正确
    

    3、整型数据在Java中有三种表现形式:十进制、八进制、十六进制
    十进制不能以0开头(除0外),八进制必须用0开头,十六进制必须以0x或0X开头
    4、Java默认浮点类型是double,为作出区分,float型小数须在后面添加f或F
    5、bool型在Java中要写成boolean

    类型转换

    精度从低到高:byte < short < int < long < float < double
    低级向高级转换时,自动转换;高级向低级转换时,需要显示类型转换,注意损失的精度

    运算符

    同c/c++

    流程控制

    同c/c++,这里只着重提一下foreach

    foreach

    foreach并不是一个关键字,只是这种写法称之为foreach语句

    for (循环变量x : 遍历对象obj) {
    }
    

    public class Repetition {
          public static void main(String args[]) {
                int arr = {7, 10, 1};
                for (int x : arr) System.out.println(x);
          }
    }
    

    数组

    下标从0开始,与c/c++不同的是,在声明数组后我们还要为其分配内存空间,通常我们一起执行

    数组元素类型 数组名 = new 元素类型[个数];
    

    创建&&初始化

    一维数组

    int a[] = {1, 2, 3};
    int b[] = new int[] {4, 5, 6};
    int c[] = new int[3];
    c[0] = 7; c[1] = 8; c[2] = 9;
    

    二维数组

    int a[][] = {{1, 3, 5}, {5, 9, 10}};
    int b[][] = new int[][] {{2, 4, 6}, {8, 12, 16}};
    int c[][] = new int[2][3];
    c[0] = new int[] {49, 81, 100}; 
    c[1][2] = 99;
    

    Java同时支持不规则数组

    int a[][] = new int[3][];
    a[0] = new int[5];
    a[1] = new int[3];
    a[2] = new int[1];
    

    获取数组长度 length

    arr(数组名).length

    其他应用

    如fill()、copyOf()、copyOfRange()、sort()等,自行查阅相关资料即可

    字符串

    创建

    创建有很多方法,这里在一段代码中分别罗列出来

    public class CreatString {
          public static void main(String args[]) {
                String a = "I'm born to be successful!"; //直接引用字符串常量
                String b = new String("所谓无底深渊,下去也是前程万里"); //构造方法
                String c = new String(a); //使用已有字符串变量实例化
                char[] charArray = {'t', 'i', 'm', 'e'};
                String d = new String(charArray); //利用字符数组实例化
                String e = new String(charArray, 0, 2); //提取字符数组部分内容
          }
    }
    

    连接

    用'+'连接其它字符串或其他数据类型

    连接字符串

    注意:Java中相连的字符串不可以被直接分为两行

    System.out.println("I like 
    Java"); //错误
    System.out.println("I like" + 
    "Java"); //正确
    

    连接其他类型

    只要'+'所连接的有一个是字符串时,系统就会将其他转换为字符串形式,即自动调用toString()

    其他函数和操作

    请自行查询资料,这里不再赘述

    可变字符串

    StringBuffer

    StringBuffer是线程安全的可变字符序列,一个类似于String的字符串缓冲区,String创建的字符串对象是不可以修改的,StringBuffer类创造的字符串序列是可修改的,且实体容量会随字符串增加而自动增加

    创建

    必须使用new方法

    append()

    将参数转换为字符串并追加到原序列

    sbf.append(obj);
    

    sbf:任意StringBuffer对象
    obj:任意数据类型对象,自动转变成字符串

    其他

    请自行查询学习

    StringBuilder

    与StringBuffer有完全相同的API,具有相同的使用方式,只不过为了效率而放弃了线程安全控制

    String, StringBuffer, StringBuilder 之间的关系

    相互转化
    public class Stringchange{
          public static void main(String args[]) {
                Stirng s1 = "Life would be too smooth if it had no rubs in it.";
                StringBuffer sbf = new StringBuffer(s1); // String -> StringBuffer
                StringBuilder sbd = new StringBuilder(s1); //String -> StringBuilder
                s1 = sbf.toString(); // sbf -> string
                s1 - sbd.toString(); // sbd -> string
                StringBuilder s2 = new StringBuilder(sbf.toString()); // sbf -> sbd;
                StringBuffer s3 = new StringBuffer(sbd.toString()); // sbd -> sbf;
          }
    }
    
    不同之处

    【1】String只能赋值一次,每一次改变内容都会在内存创建新的对象,会对系统性能产生影响
    StringBuffer 和 StringBuilder每次操作都是对自身对象做操作,不会生成新的对象,不会因生成大量匿名对象而影响系统性能
    【2】StringBuffer 的方法都使用了synchronized关键字保证线程安全,StringBuilder不具备,不考虑线程加锁所以运行效率会更高一点,即支持多线程

    面向对象编程基础

    对象、类的概念、封装性、继承性、多态性的特点,构造方法、局部变量、访问(注意Java中只用'.'操作符访问)、this与c++类似,不再赘述

    成员变量

    数据类型 变量名称 [=值] //[=值] 是可选内容,定义变量时可以赋值可以不赋值(默认值)
    

    成员方法

    [权限修饰符] [返回值类型] 方法名([参数类型 参数名]) [throw 异常类型] {
    ···
    return 返回值;
    }
    

    解释:
    [权限修饰符]:public、private、protected中任意一个,没有指定时权限为默认,即只可以在本类及同一个包的类中使用
    [返回值类型] 返回的数据类型,若不需要返回值用void;如果有,必须用return返回一个与方法返回值类型相同的数据
    [参数]:可以有参数也可以没有参数,分为
    ·值形参(实参和形参之间按值传递,即修改形参不会影响实参)
    ·引用参数(形参的类型是数组或其他引用类型,方法中对参数的修改会反映到原数据)
    ·不定长参数
    格式:参数类型... 参数名 //注意是三个点
    如:

    public class Test {
        public static void main(String[] args) {
          Test multi = new Test();
          System.out.println("Result:" + multi.add(20, 30, 40, 50, 60));
        }
        int add(int... x) {
          int ans = 0;
          for (int i = 0; i < x.length; i++) ans += x[i];
          return ans;
        }
    }
    

    static关键字

    被static修饰称为类的静态成员,是属于类所有的,区别个别对象
    调用:类名.静态成员
    静态变量:不同类之间、一个类的不同实例对象需要共同操作同一个变量
    静态常量:需要共享一个数据常量,注意给静态常量命名时,所有字母应该大写
    静态方法:不创建类的对象,直接调用类中的方法

    类的封装

    将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。

    类的继承

    child extends parents
    

    注意:java中的类只支持单继承,即一个子类指能继承一个父类

    方法的重写

    重写就是在子类中将父类的成员方法的名称保留,冲洗那边写其实现内容,更改其存储权限或修改返回值类型(重写返回值类型是基于J2SE5.0版本以上的编译器提供的新功能)
    注意:修改修饰权限只能从小范围到大范围改变
    为了在子类的方法中实现父类原有的方法,Java提供了super关键字,super关键字代表了父类的对象
    注意:如果在子类的构造方法中使用类似super()的构造方法,其他初始化代码只能写在super()后,不能写在前面,这是由于在继承的机制中,创建一个子类对象将包含一个父类子对象,实例化子类对象的时候,父类对象也会被相应实例化,会自动调用父类无参构造方法,有参的构造方法只能依赖于super关键字显示第调用

    类的多态

    重载

    编译器是根据方法名、方法各参数类型、参数的个数、参数的顺序来确定类中方法是否唯一,注意:只有返回类型不同不足以区别两个方法的重载,还需通过参数个数以及参数的类型

    向上转型

    通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
    在向上转型时,父类的对象无法调用子类独有的属性或方法
    这样做的意义在于:当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计(参考下面示例)

    class A {
             public void print() {
                      System.out.println("A:print");
             }
    }
    
    class B extends A {
             public void print() {        
                      System.out.println("B:print");
             }
    }
    
    class C extends B {
             public void print() {        
                      System.out.println("C:print");
             }
    }
    
    public class Test {
             public static void func(A a) {
                      a.print();
             }
    
             public static void main(String args[]) {
                      func(new B());  //等价于 A a =new B();
                      func(new C());  //等价于 C c =new C();
             }
    }
    

    向下转型

    通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换
    注意:能执行向下转型要求父类对象是子类对象的实例

    instanceof

    返回值为bool类型

    myobject instanceof ExampleClass
    

    解释:
    ·myobject:某类的对象引用
    ·ExampClass:某个类
    instanceof常与向下转型结合操作,结果为true时才进行向下转型

    抽象类和抽象方法

    关键字:abstruct
    抽象类(抽象类除了被继承外没有任何意义)

    [权限修饰符] abstruct class 类名 {
    ...
    }
    

    抽象方法:

    [权限修饰符] abstruct 返回值类型 方法名(参数表);//抽象方法直接以分号结尾,其本身没有任何意义除非被重写
    

    注意:构造方法不能定义为抽象方法
    例子:使用抽象类模拟“去商场买衣服"场景
    分析:
    由于我们没有对“买衣服”这个抽象行为指定一个明确的信息,因此我们可以封装一个商场的抽象类、买东西的抽象方法

    public abstruct class Market{
          public String name;
          public String goods;
          public abstruct void shop();
    }
    

    定义一个TaobaoMarket类

    public class TaobaoMarket extends Market {
          @Override //编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错
          public void shop() {
                System.ou.println(name + "网购" + goods);
          }
    }
    

    定义一个WallMarket类

    public class WallMarket extends Market {
          @Override //编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错
          public void shop() {
                System.ou.println(name + "实体店购买" + goods);
          }
    }
    

    定义一个GoShopping类

    public class GoShopping {
          public static void main(String[] args) {
          Market market = new WallMarket();
          market.name = "沃尔玛";
          market.goods = "西服";
          market.shop();
          market = new TaobaoMarket();
          market.name = "淘宝";
          market.goods = "风衣";
          market.shop();
          }
    }
    

    综上所述,使用抽象类和抽象方法时,需要遵循以下原则:
    [1]抽象类中,可以包含抽象方法,也可以不包含抽象方法,但是包含了抽象方法的必须定义为抽象类
    [2]抽象类不能直接实例化,即使抽象类中没有抽象方法也不可以实例化
    [3]抽象类被继承后,子类需要实现其中所有抽象方法
    [4]若继承抽象类的子类声明为抽象类,则可以不用实现父类中所有的抽象方法

  • 相关阅读:
    Phalcon资源文件管理(Assets Management)
    LintCode 二叉树的层次遍历 II
    atitit.修复xp 操作系统--重装系统--保留原来文件不丢失
    Matlab图像处理系列2———空间域平滑滤波器
    碰撞回避算法(一) Velocity Obstacle
    APNS 那些事!
    Cordys BOP 4平台开发入门实战演练——Webservices开发(0基础)
    python 下载整个站点
    Nginx+Tomcat+memcached负载均衡实现session共享
    linux系统下安装两个或多个tomcat
  • 原文地址:https://www.cnblogs.com/Eirlys/p/13739288.html
Copyright © 2011-2022 走看看