School of Computing and Mathematical Sciences
MSc Computing and Information Systems
JAVA Programming Week 2 January 2003
Основите на JAVA
This week – ще разгледаме типовете данни и основните граматични и пунктуационни правила правила в Java. Ще передставим възможните начини за създаване на програми и също така ще покажем как да се създават обекти, представители на предефинирани класове, и как се използват техните методи.
Компютрите работят, като използват т. нар. цикъл на вземане-обработка-запазване
-
Взема се нещо от паметта в обработващия модул
-
Прави се нещо с него в обработващия модул
-
Съхранява се обратно в паметта
Поради това са необходими инструкции за
-
Запазване на място в паметта и даване на име, например int hours;
-
Задаване на стойност на това място от паметта, например hours =39;
-
Вземане на тази стойност и извършване на операции с нея pay = hours*21;
Примитивни типове данни
Java има поредица от вградени примитиви за описание на данни, които са твърде прости за да бъдат наречени обекти, но формират по-сложни блокови консрукции. Това са:
числовите(numbers), буквените(characters) и булевите променливи(boolean variables).
Техните представители имат нужда от имена или идентификатори. Ето някои правила за това:
-
Може да бъде всяка последователност, но без интервали
-
Трябва да започва с буква или _ или $
-
Не трябва да съдържа оператори, като +,*...
-
Не може да е запазена дума
-
Желателно е да е смислен ( например CurrentAccountBalance вместо просто B)
Не бива да се забравя, че езикът Java е чувствителен към главните букви(case-sensitive). Установената практика при именоването е да се слепят думите и да се използва главна буква в началото на всяка от тези думи, като в myNewVariableName и да се използва описание на компонента като част от името, като в labelWhatIWantToSay. Имената на класовете започват с главна буква, а имената на методите с малка. Имената на променливите и обектите започват с малка буква, например myLabel вероятно се отнася за обект от клас Label.
Числовите данни могат да са:
-
Цели числа e.g. -5, 3, 180
-
Реални числа(със десетичен знак) e.g. -3.2, 3.142, 5.0, 3E10
Целочислени типове в Java
Тип Байтове Допустими стойности
byte 1 -128 до +127
short 2 -32,768 до +32,767
int 4 -2*109 до +2*109
long 8 -9*1018 до +9*1018
Типове с плаваща запетая в Java
Тип Байтове Допустими стойности
float 4 10-45 to 1038
double 8 10-324 to 10308
По подразбиране
Поради опасносността от загуба на данни Java не позволява да се преобразуват големи числа в малки, освен ако не е изрично указано. Това се нарича "casting" и трябва да е указано, например smallNumber = (short) bigNumber;
BigNumber е запазено като 2 байтово цяло число. В зависимост от това каква е била неговата стойност преди това, може да остане непроменено или да бъде отрязано (не закръглено). За реалните числа също така може да се използват символите f и d, например float weight = 3.4f {вместо (float)3.4}
Други примитивни типове данни
Тип Битове Стойности
boolean 1 истина или лъжа
char 16 един символ (unicode)
Обявяване
Синтаксисът за деклариране е
Typename variablename; например int n;
Деклариране на променлива n с тип int. Всички променливи трябва да бъдат декларирани преди да се използват. Няма значение къде в програмата са декларирани, но е препоръчително всички декларации да се правят в началото на програмата. Няколко променливи от един тип могат да се декларират заедно, например
float width, length, height;
Присвояване
Синтаксисът за присвояване на стойност на променлива о който и да е тип е
Variablename = expression;
например age = 21; area= width*length;
Декларацията и присвояването могат да бъдат комбинирани в един израз (инициализация) например int age = 21;
Обърнете внимание на разликата между char c = 'R'; и char c = R;
Оператори
Току що бе използван "=" като оператор за присвояване. Операторите са функции за управление и комбиниране на променливи и в Java те се представят с един или два символа. Пълният списък е
-
Аритметични
-
За присвояване
-
За увеличаване и намаляване
-
За сравнение
Аритметични оператори
Символ Описание Пример Резултат
+ събиране 5+2 7
- изваждане 5-2 3
* умножение 5*2 10
/ деление 5/2 2
% остатък след деление 5%2 1
Оператори за присвояване
Символ Описание Пример Резултат
+= събиране x+=2 x=x+2
-= изваждане x-=2 x=x-2
*= умножение x*=2 x=x*2
/= деление x/=2 x=x/2
%= остатък след деление x%=2 x=x%2
Оператори за увеличаване(++) и намаляване(--)
c++ означава c+=1 означава c=c+1;
c-- означава c-=1 означава c=c-1;
Внимание! когато се комбинират оператори за присвояване, увеличаване и намаляване и аритметични оператори в един израз. Операторите за увеличаване и намаляване могат да са преди или след името на променливата
например
x=++y +z; означава y=y+1;x=y+z;
x=--y +z; означава y=y-1;x=y+z;
x=y++ +z; означава x=y+z;y=y+1;
x=y-- +z; означава x=y+z;y=y-1;
Оператори за сравнение
Java има шест оператора за сравнение:
Оператор
|
Значение
|
>
|
По-голямо от
|
<
|
По-малко от
|
==
|
Равно
|
!=
|
Различно от
|
<=
|
По-малко или равно на
|
>=
|
По-голямо или равно на
|
Логически оператори And, Or, Not
Оператор
|
Значение
|
&&
|
и
|
||
|
или
|
!
|
отрицание
| Булеви променливи
Един от примитивните типове в Java е boolean. Булевите променливи могат да имат само две стойности истина или лъжа (true, false). Булевите изрази могат да са съставени от други променливи и отново да дават истина или лъжа.
например n < 10 е булев израз. x=6 е присвояване, x==6 е булев израз.
Булевите променливи могата да бъдат декларирани и инициализирани по следния начин: boolean finished; finished = false;
boolean tooheavy = (weight>200);
Могат да бъдат използвани в условни изрази
например if (finished) say("goodbye"); if(tooheavy) dropit();
Булевите изрази и/или променливи могат да се комбинират с помощта на логически оператори
например if(age>6 &&age<18) rate = junior;
if(weather==toocold||weather==toohot) action=stayinside;
Ето още един пример, за това как могат да се използват в програма:
boolean allSystemsGo;
AllSystemsGo = (temperature<=100)&&(thrust>=1200);
Crew.happy = Crew.expression==smiling;
If(allSystemsGo&&Crew.happy) initialiseLaunchSequence();
Троен условен оператор
Ето осмовната му форма
Булев израз?прави ако е истина:прави ако е лъжа
например ticketprice = age<18?5:10;
ще извърши ticketprice = 5 ако age<18 и =10 в противен случай.
Еквивалентно е на
if(age<18)ticketprice=5; else ticketprice =10;
или age<18?ticketprice=5:ticketprice=10;
Програмен поток (Program Flow)
Програмата в Java може да бъде разгледана като последователност от изрази и коментари.
Коментари
-
Започват или с:
-
/* и завършват (възможно е след няколко реда) с */
-
// и завършват с края на реда
-
Важни са за четаемостта и поддръжката на програмите
-
Могат да бъдат вмъкнати на всяко място в програмата
-
Могат да бъдат изключително полезни при елиминирането на изрази при отстраняване на грешки
-
Могат да се използват за изясняване на целта на програмен откъс
-
Има специални коментари, които могат да бъдат добавени, наречени "doc comments". Те започват с /** и завършват с **/ и се извличат от специална програма наречена javadoc и се превеждат на HTML. Като резултат се създава “help file”на програмата. Тези коментари трябва да са преди дефиницията на класа и могат да включват HTML.
Изразите могат да бъдат
-
Декларация на променлива, например int i; Customer John;
-
Изрази, като i = 3*j;i++; System.out.println(i);
-
Разклонени изрази (if, switch)
-
Циклични изрази (for, do, while)
-
Изразът return
-
Изрази за прихващане на изключения (exception handling statement)
-
Групирани заедно в блок между {…}
Блоковете могат да се използват навсякъде и да се разглеждат като единичен израз, но трябва да се отбележи, че променлива декларирана вътре в блока е валидна само в него.
Програмния поток може да бъде:
-
Последователност - всеки израз се изпълнява на един ход
-
Разклонение(branching) - изразите се изпълняват според условия
-
Повторение (looping) – изразите се изпълняват многократно
Последователността е по подразбиране.
Разклонението обикновено изисква използване на условие, if(условие)
-
Условието трябва да бъде затворено в скоби ( и ).
-
Няма ключова дума then в Java. Вместо това изразът, който непосредствено следва условието се изпълнява ако то е истина.
-
Няма затваряща ключова дума end if. Когато повече от един израз ще се изпълнява при истина, тогава те трябва да се заградят във фигурни скоби { и}.
Основна форма за едновариантен избор Когато има единичен израз за изпълнение след условието:
if (условие) израз;
например if(x>5) y=6;
Условието може да бъде съставено от поредица от условия свързани с помощта на съюзите
&&(И) , || (ИЛИ), ! (НЕ)
например if ((mark>=60)&&(mark<=70)) result ="merit";
Когато има множество изрази за изпълнение след условието:
if (условие) {
израз 1;
израз 2;
...
израз n;
}
Дори когато има единичен израз за изпълнение, той може да бъде заграден в скоби { и},
например
if (age >17) {
g.drawString ("You may vote", 50, 50);
}
Много програмисти предпочитат да използват този стил.
Естествено Java позволява двувариантен избор с помощта на else частта.
Основна форма за двувариантен избор
if (условие) {
изрази за изпълнение ако условието е истина
} else {
изрази за изпълнение ако условието е лъжа
}
например if(x>5){ y=6; }else{ y=4;}
if (myAge>yourAge){ response="I am older";
}else{response= "You are older";}
Важно
-
След if и/или else може да има блокове
например
if (age >17) {
g.drawString ("Congratulations!", 50, 50);
g.drawString ("You may vote", 50, 70);
} else {
g.drawString ("Sorry", 50, 50);
g.drawString ("You may not vote", 50, 70);
}
if..else блоковете могат да съдържат други if..else блокове. Добър стил на програмиране е в такъв случай всеки else да се подравнява със съответния if. Това дава по голяма яснота.
например
if(aif(b
else
if(a
else order="cab";
else
if (aelse
if(belse order="cba";
-
Ако има много if условия за прилагане върху един и същ израз е по-ефективно да се използва Java израза switch.
Синтаксисът е:
switch (израз*){
case стойност: израз; break;
case стойност: израз; break;
...
default : израз; break;
}
NB
-
Изразът израз* може да бъде само от тип int,byte или char
-
Трябва да има break за всяка възможност
-
Не е задължително вариантите да следват точно определен ред
-
Може да има няколко случая, които дават един и същ израз (ако е така е необходим само един израз и break)
-
Управлението ще се предаде извън switch, когато бъде намерено първото съвпадение.
например
switch(month){
case 9:
case 4:
case 6:
case 11: days = 30; break;
case 2: {if (leapyear) days =29 else days = 28};break;
default: days = 31; break;
}
Приоритет на операторите
-
Първо се изчислява всичко в скобите например (2+3)*4 20
-
* / % се изчисляват преди +,- например 2+3*4 14
-
Операторите с един и същ приоритет се изчисляват от ляво на дясно например 2*3/4 1
При операции със смесени типове данни, типа на резултата се разширява до най-големия в израза.
byte short int long float double
Забележка
int i = 3.4*9; //ще се провали
int i = (int)3.4*9; //ok
Създаване и деклариране на обекти
Да се запомни:
-
Класа е описанието което дефинира какви ще са данните и методите на обекта
-
обекта е представител на клас
-
могат да бъдат създадени много представители на клас (instantiation).
-
за да се създаде обект трябва
ClassName objectName; да се декларира
ObjectName = new ClassName(); да се създаде
Например пакета awt съдържа клас наречен Label. Може да се направи
Label myLabel;
myLabel = new Label();
Или на един ред: Label myLabel = new Label();
Label() е пример за специален тип метод наречен конструктор. Може да има повече от един конструктор за даден клас. В примера по-долу се създават три представителя на клас Label, като се използват три различни конструктора, имащи съответно 0, 1 и 2 параметъра.
Пр 2.1
//LabelMania
//Демонстрация на Label конструктори
import java.awt.*;
import java.applet.*;
public class LabelMania extends Applet {
public void init(){
//използване на най-простия конструктор (без параметри)
Label firstLabel = new Label();
//използване на ’един стринг’ конструктор
Label secondLabel = new Label("This is the second label");
// използване на ‘стринг и аргумент’ конструктор
Label thirdLabel = new Label("Centered", Label.CENTER);
//вмъкване на етикетите в аплета
add(firstLabel);
add(secondLabel);
add(thirdLabel);
} // край на init
} // край на labelMania
Да се запомни:
-
Когато се създава променлива от примитивен тип се заделя място в паметта.
-
Декларирането и създаването на обект са две отделни стъпки, въпреки че те могат да бъдат комбинирани в един израз.
Използване на обекти
След като обекта бъде създаден методите и данните могат да бъдат достъпни с помощта на точка:
Objectname.data сочи данните на обекта
Objectname.method() сочи метод на обекта.
Често може да се срещне "this." вместо "objectName." Ключовата дума "this" е указател към текущия обект.
По подразбиране данните на обекта са достъпни за останалите обекти, но това нарушава неговата самостоятелност (object's privacy). Не бива да се променя състоянието на обекта без да се познава. По-добрият начин е да се включат методите "set" и "get" в дефиницията на класа. Те се наричат Mutator и Accessor методи.
-
Mutator метода модифицира състоянието на обекта (променя стойностите на атрибутите му)
например labelName.setForeground(Color.white)
-
Accessor метода запитва обекта за някои негови данни без да го променя
например labelName.getFont()
В следващия пример се създават два обекта – от тип Label и от тип Font и се използват някои от методите на класа Label за да се подобри външният вид на съобщението.
Пр 2.2
//MyThird.java
//други подобрения в аплета MyFirst
import java.awt.*;
import java.applet.*;
public class MyThird extends Applet{
public void init(){
//Създаване на обект наречен myLabel
Label myLabel = new Label("Hello, world!!!");
// Създаване на обект наречен myFont
Font myFont = new Font("SansSerif", Font.PLAIN, 20);
//Подобряване на етикета
myLabel.setFont(myFont);
myLabel.setBackground(Color.blue);
myLabel.setForeground(Color.white);
myLabel.setAlignment(Label.CENTER);
//Вмъкване на етикета в аплета
add(myLabel);
} // край на init
} // край на applet
Как да се установяват цветове
Цветовете в Java са отделени в класа Color който има 13 предварително дефинирани стойности {black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow}.
Например за да се установи зелен цвят на фона на елемент се използва
Elementname.setBackground(Color.green).
За да се установи бял цвят за фон на аплета (сив по подразбиране) може да се използва
setBackground(Color.white)
Може да бъде дефиниран и цвят различен от стандартните
Color mycolour = new Color(r,g,b)
Тогава g.setColor(mycolour) го прилага към графичния обект g.
Установяване на шрифт
Класът Font в Java има три аксесоара:
-
Име - как в същност ще се появи на хост-машината
-
SanSerif – може да се изобрази като Arial или Helvetica
-
Serif - може да се изобрази като Times Roman
-
Monospaced - може да се изобрази като Courier
-
Стил – може да бъде установен с числата 0=plain, 1=bold,2=italic,3=bold и italic
Или като се използват вградените константи: Font.BOLD, Font.ITALIC, Font.PLAIN
Създаване на представител на обект от тип Font
Font myFont = new Font(name,style,size)
Прилагане към обекта objectName.setFont(myfont)
Програмиране на Java 2
18>
Сподели с приятели: |