3.5.5 Преобразование типа
Java, будучи строгим языком типов, проверяет совместимость типа (если тип может заменяться другим типом в данном контексте) в определённое время. Однако, некоторые проверки возможны только во время выполнения. В этих случаях, Java требует использовать приведение типа, чтобы явно указать преобразование типа.
(<тип>) <выражение>
Следующая программа демонстрирует некоторые преобразования типов, которые требуют приведений:
Пример 10:
//Demonstrate casts
public class Conversion
{
public static void main(String[] args)
{
byte b;
int i = 257;
double d = 323.142;
System.out.println( nConversion of int to byte );
b = (byte)i;
System.out.println( i and b +i+ +b);
System.out.println( nConversion of double to int );
i = (int)d;
System.out.println( d and i +d + +i);
System.out.println( nConversion of double to byte );
b = (byte)d;
System.out.printlnf d and b +d+ +b);
}
}
Вывод следующей программы:
Рисунок 3.14: Вывод
В следующем коде мы создаём объект типа vehicle (транспортное средство) с частью информации, содержавшейся в другом классе ( Convertible1)
convertible Convertible1 = new convertible ();
vehicle Vehiclel = (vehicle) Convertible1();
// We now have an object of type vehicle with some of the information contained
// in Convertible1.
Будьте осторожны с приведением типов - оно может не всегда делать то, о чём мы думаем: Просмотрите код ниже:
char symbol = 7 ;
System.out.println((int)symbol);
// This does not print 7, but in fact 55 (the ASCII value of the character '7')
Пример наследования
Пример 11:
class Employee
{
String name;
char sex;
Employee(String n, char s)
{
name = n;
sex = s;
}
public String getName()
{
return name;
}
public char getSex ()
{
return sex;
}
}
class Worker extends Employee
{
char category;
boolean dressAllowance;
Worker(String n,char s,char c,boolean d)
{
super(n,s);
category = c;
dressAllowance = d;
}
public char getCategory()
{
return category;
}
public boolean getAll()
{
return dressAllowance;
}
}
class Officer extends Employee
{
char empClass;
int experience;
boolean vehicle;
Officer(String n,char s,char c,int e,boolean v)
{
super(n,s);
empClass = c;
experience = e;
vehicle = v;
}
public char getEmpClass()
{
return empClass;
}
public int getExp()
{
return experience;
}
public boolean getVehicle()
{
return vehicle;
}
}
Public class InheDemo
{
public static void main(String args[])
{
Worker w = new Worker( M.John , M , В ,true);
System.out.println( Worker Information );
System.out.println( Name : +w.getName());
System.out.println( Sex : +w.getSex());
System.out.println( Category : +w.getCategory());
if(w.getAll())
System.out.println( Dress allowance is paid );
else
System.out.println( Dress allowance is not paid );
Officer о = new Officer( S. David , F , I ,15,true); System.out.println( nOfficer Information );
System.out.println( Name : +o.getName());
System.out.println( Sex : +o.getSex());
System.out.println( Class : +o.getEmpClass());
System.out.println( Experience: +o.getExp()+ years );
if(o.getVehicle ())
System.out.println( Vehicle is provided ) ;
else
System.out.println( Vehicle is not provided );
}
}
Вывод программы:
Рисунок 3.15: Вывод InheDemo
В вышеупомянутой программе имеется три класса: Employee, Worker and Officer.
Служащий (Employee) может быть рабочим (Worker) или офицером (Officer), но они имеют свойства имя (name) и пол (sex). Предположим, что служащий может быть в категории рабочего или офицера. Если служащий попадает в категорию офицера, то свойства офицера наследуются подобно vehicle (см. выше) от родительского класса. Через наследование, мы можем избежать дублирования. Например, без наследования мы должны были обеспечить свойства имя (name) и пол (sex) в классе Рабочего так же как в классе Офицера.
В программе, класс Employee является суперклассом а классы Worker и Officer его подклассы. Следовательно, все методы Employee доступны Worker и Officer. В классе InheDemo мы создали объекты класса Worker и Officer. С помощью этих объектов мы обращаемся к методам класса Employee подобно
w.getName () ;
о .getName () ;
Здесь, мы не создаем объект класса Employee, но через его подклассы, мы можем вызвать конструктор класса Employee. Это делается с помощью ключевого слова «super». Инструкция в классе Worker или Officer
super(n,s);
вызывает конструктор суперкласса, которым является класс Служащего (Employee) и передаёт ему эти два параметра (n и s).
Обратите внимание: Инструкция, с помощью которой вызывается конструктор суперкласса, должна быть первой записью в конструкторе подкласса. Это происходит потому, что в памяти формируется сначала суперкласс а затем подкласс.