Восемь мифов про Java




_



Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания апплетов, приложений и серверного программного обеспечения.

Программы на Java могут быть транслированы в байт-код, выполняемый на виртуальной java-машине (JVM) — программе, обрабатывающей байт-код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байт-код, в отличие от текста, обрабатывается значительно быстрее.

Язык Java зародился как часть проекта создания передового программного обеспечения для различных бытовых приборов. Реализация проекта была начата на языке C++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента — языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами.

Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было продиктовано желанием предоставить синтаксис, сходный с C и C++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C++.

Три ключевых элемента объединились в технологии языка Java

  • Java предоставляет для широкого использования свои апплеты (applets) — небольшие, надежные, динамичные, не зависящие от платформы активные сетевые приложения, встраиваемые в страницы Web. Апплеты Java могут настраиваться и распространяться потребителям с такой же легкостью, как любые документы HTML
  • Java высвобождает мощь объектно-ориентированной разработки приложений, сочетая простой и знакомый синтаксис с надежной и удобной в работе средой разработки. Это позволяет широкому кругу программистов быстро создавать новые программы и новые апплеты
  • Java предоставляет программисту богатый набор классов объектов для ясного абстрагирования многих системных функций, используемых при работе с окнами, сетью и для ввода-вывода. Ключевая черта этих классов заключается в том, что они обеспечивают создание независимых от используемой платформы абстракций для широкого спектра системных интерфейсов

Элементы синтаксиса:

Комментарий до конца строки //
Комментарии, которые не могут быть вложенными /* ... */
Регистрозависимость да
Регулярное выражение идентификатора переменной [_a-zA-Z$][_a-zA-Z0-9$]*
Присваивание значения переменной =
Объявление переменной type variable
Объявление переменной с присваиванием значения type variable = value
Группировка выражений ( ... )
Блок { ... }
Равенство ==
Неравенство !=
Сравнение < > <= >=
Вызов функции f(a, b, ...)
Вызов функции без параметров f()
Последовательность ;
Если - то if (condition) ...
Если - то - иначе if (condition) ... else ... или condition ? ... : ...
Бесконечный цикл while (true) ...
Цикл с предусловием while (condition) ...
Цикл с постусловием do ... while (condition)
Цикл for - next для диапазона целых чисел с инкрементом на 1 for (int i = 1; i <= 10; i++) ...
Цикл for - next для диапазона целых чисел с декрементом на 1 for (int i = 10; i > 0; i--) ...

IDE/Редакторы:

Примеры:

Hello, World!:

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

Для Java приведенный код должен находиться в файле HelloWorld.java.

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

Факториал:

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

Используется рекурсивное определение факториала. Для хранения больших чисел использован элементарный тип данных long, позволяющий хранить числа от -263 до 263-1.

public class Factorial { 
    static long factorial(int n) 
    { 
        return ( n==0 ? 1 : n*factorial(n-1) ); 
    } 
    public static void main(String[] args) 
    { 
        for (int n=0; n<=16; n++) 
            System.out.println(n+"! = "+factorial(n)); 
    } 
} 

Числа Фибоначчи:

Используется рекурсивное определение чисел Фибоначчи.

public class Fibonacci { 
    static int fibonacci(int n) 
    { 
        return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2)); 
    } 
    public static void main(String[] args) 
    { 
        for (int n=1; n<=16; n++) 
            System.out.print(fibonacci(n)+", "); 
        System.out.println("..."); 
    } 
} 

Факториал:

Используется итеративное вычисление факториала. Для хранения больших чисел используется встроенный класс BigInteger, позволяющий обрабатывать сколь угодно большие числа ценой увеличения времени обработки.

import java.math.BigInteger; 
 
public class Factorial { 
    public static void main(String[] args) 
    { 
        BigInteger f = new BigInteger("1"); 
        System.out.println("0! = " + f.toString()); 
        for (int n=1; n<=16; n++) 
        {   f = f.multiply(new BigInteger(""+n)); 
            System.out.println( n + "! = " + f.toString()); 
        } 
    } 
} 

Квадратное уравнение:

В Java нет типа данных для работы с комплексными числами, поэтому вычисления производятся в дробных числах и выполняется отдельная проверка на знак дискриминанта. Реализация позволяет решать квадратные уравнения не только с целыми, но и с дробными коэффициентами.

Коэффициенты читаются из потока System.in. Напрямую из него можно читать только отдельные байты, поэтому для повышения комфортности чтения используются классы InputStreamReader и BufferedReader. Строки, прочитанные из System.in, преобразуются в числа типа double с помощью метода Double.parseDouble(). Все операции ввода в Java должны находиться внутри блоков try ... catch, чтобы гарантированно обрабатывать IOException — класс исключений, порождаемых функциями чтения.

import java.util.*; 
import java.io.*; 
 
public class Quadratic { 
    static String print(double real, double imag) 
    {   if (Math.abs(imag)<1E-6) 
            return ""+real; 
        else 
            return "("+real+","+imag+")"; 
    } 
    public static void main(String[] args) 
    {   double A,B,C,D; 
      try { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        System.out.print("A = "); 
        A = Double.parseDouble(br.readLine()); 
        if (Math.abs(A)<1E-3) 
        {   System.out.println("Not a quadratic equation."); 
            return; 
        } 
        System.out.print("B = "); 
        B = Double.parseDouble(br.readLine()); 
        System.out.print("C = "); 
        C = Double.parseDouble(br.readLine()); 
      } 
      catch (Exception e) { 
        System.err.println("An error occured while reading input parameters."); 
        return; 
      } 
        A = 2*A; 
        D = B*B-2*A*C; 
        if (Math.abs(D)<1E-3) 
        {   System.out.println("x = "+(-B/A)); 
            return; 
        } 
        if (D>0) 
            System.out.println("x1 = "+print((-B+Math.sqrt(D))/A, 0)+"\nx2 = "+print((-B-Math.sqrt(D))/A, 0)); 
        else 
            System.out.println("x1 = "+print(-B/A,Math.sqrt(-D)/A)+"\nx2 = "+print(-B/A,-Math.sqrt(-D)/A)); 
    } 
} 

CamelCase:

В этом примере используются регулярные выражения Java. Регулярное выражение [a-zA-Z]+ описывает последовательность букв латинского алфавита в любом регистре, идущих подряд, окруженную другими символами или концами строки. Пара классов Pattern и Matcher позволяют создать это регулярное выражение и извлечь из строки все фрагменты, соответствующие ему. Для каждого такого фрагмента его первый символ переводится в верхний регистр, а последующие — в нижний, с использованием стандартных методов класса String. Наконец, результаты обработки фрагмента записываются в переменную типа StringBuffer, накапливающую результат.

import java.util.regex.*; 
import java.io.*; 
 
public class CamelCase { 
    public static void main(String[] args) { 
      try { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        Pattern p = Pattern.compile("[a-zA-Z]+"); 
        Matcher m = p.matcher(br.readLine()); 
        StringBuffer result = new StringBuffer(); 
        String word; 
        while (m.find()) { 
            word = m.group(); 
            result.append(word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase()); 
        } 
        System.out.println(result.toString()); 
      } catch (Exception e) { 
        System.err.println("An error occured while reading input string."); 
      } 
    } 
} 

Источник



Сайт управляется системой uCoz