JAVA两天速成

找工作的时候发现某公司在线编程题只支持JAVA和C家族,作为一个天天python的我简直是灾难,两天速成一下!

第一部分:Java基础

封装与接口

  • 在一个.java文件中,有且只能有一个类带有public关键字。不带关键字的也是可见的,后面会说到。

Interface接口

  interface Cup {
      void addWater(int w);
      void drinkWater(int w);
  }
  
  class MusicCup implements Cup 
  {
      public void addWater(int w) 
      {
          this.water = this.water + w;
      }
  
      public void drinkWater(int w)
      {
          this.water = this.water - w;
      }
  
      private int water = 0;
  }
  • 更易于管理
  • 一个类可以使用多个interface

  • 在.java文件的第一行写上package com.vamei.society

  • 一个Java文件中只能有一个public的类,这个类要和文件同名!

  • 一个Java类的完整路径由它的包和类名共同构成,比如com.vamei.society.Human。相应的Human.java程序要放在com/vamei/society/下。

  • 一个类可以没有public关键字,它实际上也表示一种权限: 该类在它所在的包中可见。

包的调用

  • 我们只需要将Human.java编译的Human.class放入相应的文件夹就可以了。比如,我将Human.class放入com/vamei/society/中。实际上,你也可以把.java文件放入相应路径,Java会在使用时自动编译。

  • 如果整个包(也就是com文件夹)位于当前的工作路径中,那么不需要特别的设置,就可以使用包了。

  • 可以这样import

  import com.vamei.society.*;
  • 也可以直接提供完整路径使用,则不需要import

  • 如果包没有放在当前工作路径下,我们在使用包时,需要通知Java。设置系统的CLASSPATH环境变量。

继承

  class Woman extends Human
  {
      /**
      * new method
      */
      public Human giveBirth()
      {
          System.out.println("Give birth");
          return (new Human(20));
      }
  }
  • 基类和衍生类

  • 衍生类不能访问基类的私有对象,public的是一样的都可以访问,衍生类可以访问自己的private,外部不能访问衍生类的private。

  • protected表示自己不能被外部访问,但是可以被衍生类访问。

  • super和this类似,但是super指父类,比如父类有个getHeight()方法,那么在子类定义新的getHeight()时可以在内部先执行super.getHeight()。当子类和父类有同样方法时(参数都一样),那么对外呈现子类的,内部可以用super或者this区分。

  • 调用父类的构造方法直接输入super即可。

  class Woman extends Human
  {
      /**
      * constructor
      */
      public Woman(int h)
      {
          super(h); // base class constructor
          System.out.println("Hello, Pandora!");
      }
  }

static 类数据与类方法

  • 带static的成员变量是类成员变量,被所有对象共享

  • 如果一个方法声明为static,那么它只能调用static的数据和方法,而不能调用非static的数据和方法。

  • 调用类方法时,我们可以通过class.method()的方式调用,也可以通过object.method()的方式调用。

  • 如果变量前加final,那么这个变量一旦赋值不能更改(当然如果这时类的实例,这个实例可以照常操作)

接口的继承与抽象类

  • 接口可以继承接口,而且可以多重继承,但是类不行。
  interface MusicCup extends Cup, Player 
  {
      void display();
  }
  • 抽象类
  abstract class Food {
      public abstract void eat();
      public void happyFood()
      {
          System.out.println("Good! Eat Me!");
      }
  }
  • 抽象类中有抽象方法,继承的时候一定要覆盖这些抽象方法,抽象类与接口不同的是它也有具体方法以及具体变量。

对象引用

  Human aPerson = new Human(160);
  • 首先看等号的右侧。new是在内存中为对象开辟空间。具体来说,new是在内存的堆(heap)上为对象开辟空间。这一空间中,保存有对象的数据和方法。

  • 再看等号的左侧。aPerson指代一个Human对象,被称为对象引用(reference)。实际上,aPerson并不是对象本身,而是类似于一个指向对象的指针。aPerson存在于内存的栈(stack)中。

  • 当我们用等号赋值时,是将右侧new在堆中创建对象的地址赋予给对象引用。

  • 这里的内存,指的是JVM (Java Virtual Machine)虚拟出来的Java进程内存空间。

  • new关键字的完整含义是,在堆上创建对象。栈比较快。

  • 基本类型(primitive type)的对象,比如int, double,保存在栈上。

  • 一个对象可以有多个引用 (一个人可以放多个风筝)。当程序通过某个引用修改对象时,通过其他引用也可以看到该修改。

垃圾回收

  • 随着方法调用的结束,引用和基本类型变量会被清空。由于对象存活于堆,所以对象所占据的内存不会随着方法调用的结束而清空。进程空间可能很快被不断创建的对象占满。

  • Java内建有垃圾回收(garbage collection)机制,用于清空不再使用的对象,以回收内存空间。

  • 当没有任何引用指向某个对象时,该对象被清空。

参数传递

  • 基本类型变量的值传递,意味着变量本身被复制,并传递给Java方法。Java方法对变量的修改不会影响到原变量。

  • 引用的值传递,意味着对象的地址被复制,并传递给Java方法。Java方法根据该引用的访问将会影响对象。

  • 就是new出来的是引用传递,普通的是值传递,普通的是存在栈中的。

类型转换与多态

  • Java是一种强类型(strongly typing)语言,它会对类型进行检查。比如奖Cup类的对象赋给Human类的引用就会报错。

  • 为什么python也是强类型?

  >>> 3+6
  9
  >>> "3"+6
  error
  • python看起来是弱类型因为它的引用不用指定类型!!

基本类型变换

  • 注意,只是基本类型!!!
  int a;
  a = (int) 1.23;  // narrowing conversion
  int a = 3;
  double b;
  b = a; // widening conversion
  • widening可以不加变量类型的

upcast与多态

  public class Test
  {
      public static void main(String[] args)
      { 
          Cup aCup;
          BrokenCup aBrokenCup = new BrokenCup();
          aCup = aBrokenCup; // upcast
          aCup.addWater(10); // method binding
      }
  }
  • 我们随后调用了aCup(我们声明它为Cup类型)的addWater()方法。尽管aCup是Cup类型的引用,它实际上调用的是BrokenCup的addWater()方法!也就是说,即使我们经过upcast,将引用的类型宽松为其基类,Java依然能正确的识别对象本身的类型,并调用正确的方法。Java可以根据当前状况,识别对象的真实类型,这叫做多态(polymorphism)。多态是面向对象的一个重要方面。

  • Java告诉我们,一个衍生类对象可以当做一个基类对象使用,而Java会正确的处理这种情况。

downcast

  • 我们可以将一个基类引用向下转型(downcast)成为衍生类的引用,但要求该基类引用所指向的对象,已经是所要downcast的衍生类对象。比如可以将上面的hisCup向上转型为Cup类引用后,再向下转型成为BrokenCup类引用。

object类

  • Java中,所有的类实际上都有一个共同的继承祖先,即Object类。

第二部分:JAVA进阶

String

  • String也是引用传递,不过它不需要new

  • String是不可变对象,即使用replace也只是返回一个新的String

  • 常用String的方法

  s.length()                        返回s字符串长度
  s.charAt(2)                       返回s字符串中下标为2的字符 
  s.substring(0, 4)                 返回s字符串中下标0到4的子字符串
  s.indexOf("Hello")                返回子字符串"Hello"的下标
  s.startsWith(" ")                 判断s是否以空格开始
  s.endsWith("oo")                  判断s是否以"oo"结束
  s.equals("Good World!")           判断s是否等于"Good World!"
                                    ==只能判断字符串是否保存在同一位置。需要使用equals()判断字符串的内容是否相同。 
  s.compareTo("Hello Nerd!")        比较s字符串与"Hello Nerd!"在词典中的顺序,
                                    返回一个整数,如果<0,说明s在"Hello Nerd!"之前; 
                                                如果>0,说明s在"Hello Nerd!"之后;
                                                如果==0,说明s与"Hello Nerd!"相等。
  s.trim()                          去掉s前后的空格字符串,并返回新的字符串
  s.toUpperCase()                   将s转换为大写字母,并返回新的字符串
  s.toLowerCase()                   将s转换为小写,并返回新的字符串
  s.replace("World", "Universe")    将"World"替换为"Universe",并返回新的字符串

异常处理

  try {
    ...;
  }
  catch(IOException e) {
      e.printStackTrace();
      System.out.println("IO problem");
  }
  catch() {
    ...;
  }
  finally {
    ...;
  }
  • 下图中红色的是unchecked错误,应该由程序员编程解决。蓝色的是由于和编程环境互动产生的错误,应该做异常处理。
java异常处理
  • 抛出异常
    private void test(double p) throws Exception // 包含throws关键词不一定会throw错误,只是做检查
    {
        if (p < 0) {
            Exception e = new Exception("p must be positive");
            throw e;
        }
    }
  • 我们在useBattery()中有异常处理器。由于test()方法不直接处理它产生的异常,而是将该异常抛给上层的useBattery(),所以在test()的定义中,我们需要throws Exception来说明。

  • 我们可以自定义异常类,只要继承现有异常类就可以了。

IO基础

  • 基本操作,读文件,文件要在project目录下
    public static void main(String[] args) {
        try {
            BufferedReader br =
                    new BufferedReader(new FileReader("file.txt"));

            String line = br.readLine();

            while (line != null) {
                System.out.println(line);
                line = br.readLine();
            }
            br.close();
        } catch (IOException e) {
            System.out.println("IO Problem");
        }
    }
  • BufferedReader()是一个装饰器(decorator),它接收一个原始的对象,并返回一个经过装饰的、功能更复杂的对象。

  • 基本操作,写文件

   try {
            String content = "Thank you for your fish.";

            File file = new File("new.txt");

            // create the file if doesn't exists
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();

        }
        catch(IOException e) {
            System.out.println("IO Problem");
        }
    }

内存管理与垃圾回收

  • 在Java中,JVM中的栈记录了线程的方法调用。每个线程拥有一个栈。在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame)。在frame中,保存有该方法调用的参数、局部变量和返回地址。

  • Java的参数和局部变量只能是基本类型的变量(比如int),或者对象的引用(reference)。因此,在栈中,只保存有基本类型的变量和对象引用。引用所指向的对象保存在堆中。(引用可能为Null值,即不指向任何对象)

  • 当被调用方法运行结束时,该方法对应的帧将被删除,参数和局部变量所占据的空间也随之释放。线程回到原方法,继续执行。当所有的栈都清空时,程序也随之运行结束。

循环引用

  • 我们以栈和static数据为根(root),从根出发,跟随所有的引用,就可以找到所有的可到达对象。也就是说,一个可到达对象,一定被根引用,或者被其他可到达对象引用。
java循环引用.png

JVM垃圾回收

  • JVM的垃圾回收是多种机制的混合。JVM会根据程序运行状况,自行决定采用哪种垃圾回收。

  • 我们先来了解"mark and sweep"。这种机制下,每个对象将有标记信息,用于表示该对象是否可到达。当垃圾回收启动时,Java程序暂停运行。JVM从根出发,找到所有的可到达对象,并标记(mark)。随后,JVM需要扫描整个堆,找到剩余的对象,并清空这些对象所占据的内存。

  • 另一种是"copy and sweep"。这种机制下,堆被分为两个区域。对象总存活于两个区域中的一个。当垃圾回收启动时,Java程序暂停运行。JVM从根出发,找到可到达对象,将可到达对象复制到空白区域中并紧密排列,修改由于对象移动所造成的引用地址的变化。最后,直接清空对象原先存活的整个区域,使其成为新的空白区域。

  • 可以看到,"copy and sweep"需要更加复杂的操作,但也让对象可以紧密排列,避免"mark and sweep"中可能出现的空隙。在新建对象时,"copy and sweep"可以提供大块的连续空间。因此,如果对象都比较"长寿",那么适用于"mark and sweep"。如果对象的"新陈代谢"比较活跃,那么适用于"copy and sweep"。

  • 上面两种机制是通过分代回收(generational collection)混合在一起的。每个对象记录有它的世代(generation)信息。所谓的世代,是指该对象所经历的垃圾回收的次数。世代越久远的对象,在内存中存活的时间越久。

容器

数组

  Human[] persons = new Human[2];              // array size 2
  persons[0] = new Human(160);
  persons[1] = new Human(170);

  int[] a = {1, 2, 3, 7, 9};                   // array size 5
  System.out.println(a[2]);

  String[] names = {"Tom", "Jerry", "Luffy"};  // array size 3
  System.out.println(names[0]);

List

  import java.util.*;

  public class Test
  {
      public static void main(String[] args)
      {
          List<String> l1 = new ArrayList<String>();
          l1.add("good");
          l1.add("bad");
          l1.add("shit");
          l1.remove(0);
          System.out.println(l1.get(1));
          System.out.println(l1.size());
          Iterator i = l1.iterator();
          while(i.hasNext()) {
              System.out.println(i.next());
        }
      }
  }
  • 输出可以用Iterator

  • List是接口,ArrayList是实现

集合Set

  import java.util.*;

  public class Test
  {
      public static void main(String[] args)
      {
          Set<Integer> s1 = new HashSet<Integer>();
          s1.add(4);
          s1.add(5);
          s1.add(4);
          s1.remove(5);
          System.out.println(s1);
          System.out.println(s1.size());
      }
  }

Map 如HashMap

  import java.util.*;

  public class Test
  {
      public static void main(String[] args)
      {
          Map<String, Integer> m1 = new HashMap<String, Integer>();
          m1.put("Vamei", 12);
          m1.put("Jerry", 5);
          m1.put("Tom", 18);
          System.out.println(m1.get("Vamei"));
  
      }
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,066评论 0 62
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,182评论 11 349
  • 看到一篇文章,讲到同性恋们或欺骗不知情的女孩当同妻,或女孩们自愿当同妻,或gay和les组合各取所需,其中痛...
    跃鳞在野阅读 576评论 0 1
  • 昨晚上做了一个梦,虽然已经工作了一整天,但是对这个梦依然记忆清晰。。。 梦中有一个女人和一个男人,男人坐在桌前不知...
    马会会阅读 350评论 0 1