Модификаторы класса
В объявлении класса могут употребляться некоторые служебные слова-модификаторы, придающие классу дополнительные свойства.
public. Модификатор publiс помечает класс признаком общедоступности. Он означает, что в любом коде позволяется объявлять ссылки на объекты класса и обращаться к его членам, отмеченным как рubliс. Если модификатор рubliс не задан, класс будет доступен только в контексте пакета, которому принадлежит.
Большинством инструментальных средств разработки Java выдвигается требование, чтобы объявление класса с модификатором рubliс сохранялось в файле с тем же именем, которое присвоено классу, отсюда следует, что файл не может содержать более одного объявления класса, Помеченного как рubliс.
private. Самый ограничивающий модификатор – private. Приватный метод или переменная могут быть использованы только внутри объекта класса, в котором они объявлены.
protected. Класс, обозначенный модификаторомprotectedможет иметь переменные и методы защищённые модификатором доступа. Защищённый элемент доступен всем остальным классам из того же пакета, как и в случае с доступом по умолчанию. Кроме того, защищённый элемент класса доступен всем его подклассам, даже если они находятся в других пакетах.
abstract. Класс, обозначенный модификатором abstract, трактуется как неполный; другими словами, создавать экземпляры такого класса запрещено. Подобное свойство класса обычно обусловлено наличием в его объявлении абстрактных методов (снабженных тем же модификатором abstract), которые, как предполагается по определению, должны быть реализованы в производных классах. Абстрактные классы перекладывают имплементацию методов на "плечи" своих подклассов.
final. Класс, определенный как final, не допускает наследования. Переменная, имеющая модификатор final, должна быть инициализирована внутри тела класса, так как вне тела класса final-переменная является константой и ее изменение или инициализация запрещены.
strict floating point. Присутствие в объявлении класса модификатора strictfp означает, что операции с плавающей запятой, предусмотренные методами-членами класса, должны выполняться точно и единообразно всеми виртуальными машинами Java.
Вполне очевидно что в объявлении класса одновременно не могут быть использованы модификаторы final и abstract.
Объявление способно содержать несколько модификаторов. Порядок их указания несуществен, но рекомендуется избрать тот, который, по вашему мнению, выглядит более предпочтительным, и последовательно его придерживаться.
Практическое задание № 1
Разработать программу для расчета отношения величины средней зарплаты сотрудников фирмы к максимальной зарплате. Расчет средней зарплаты осуществляется для сотрудников, зарплата которых выше 500 дол. Исходная информация о зарплате сотрудников хранится на сервере. Клиент посылает запрос на сервер, назад получает результат. Клиент имеет возможность просмотра, редактирования, удаления информации на сервере.

Server.Java:
package server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server {
private Selector selector;
private DatagramChannel channel;
private final RequestHandler reqHandler;
private volatile boolean stopFlag;
private static final Logger logger = Logger.getLogger(Server.class.getName());
public static void main(String[] args)
{
Server server = new Server();
server.init(2020);
server.start();
}
public void start() {
try {
while (!selector.keys().isEmpty() && !stopFlag) {
try {
int keysCount = selector.select(500);
if (keysCount > 0) {
Set<SelectionKey> selected = selector.selectedKeys();
synchronized (selected)
{
Iterator<SelectionKey> iterator = selected.iterator();
while (iterator.hasNext())
{
SelectionKey nextKey = iterator.next();
if (nextKey.isValid()) {
if (nextKey.isReadable()) {
logger.log(Level.INFO, "Accepting incoming request");
reqHandler.service((DatagramChannel) nextKey.channel());
}
}
iterator.remove();
}
}
}
} catch (Exception ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
finally {
try {
logger.log(Level.INFO, "Server is stopping");
this.selector.close();
this.channel.close();
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE,
"Error stopping server", ex);
}
}
}
public void stop()
{
this.stopFlag = true;
}
public Server() {
this.reqHandler = RequestHandler.getInstance();
}
public void init(int port) {
try {
SocketAddress address = new InetSocketAddress(port);
this.channel = DatagramChannel.open();
this.channel.socket().bind(address);
this.channel.configureBlocking(false);
this.selector = Selector.open();
this.channel.register(this.selector, SelectionKey.OP_READ);
logger.log(Level.INFO, "Server initialized");
} catch (IOException ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
ManagerView.java:
package client;
import data.Employee;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class ManagerView extends javax.swing.JFrame {
private RemoteUserRegistry rUserRegistry;
private ConnectionDialog connectDialog;
private Executor executor;
/** Creates new form RatesManagerView */
public ManagerView() {
initComponents();
setResizable(false);
setLocationRelativeTo(null);
setTitle("Salary Manager");
clearUI();
rUserRegistry = new RemoteUserRegistry();
connectDialog = new ConnectionDialog(this, true);
connectDialog.setLocationRelativeTo(this);
executor = Executors.newSingleThreadExecutor();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel5 = new javax.swing.JLabel();
jFrame1 = new javax.swing.JFrame();
jFrame2 = new javax.swing.JFrame();
jDialog1 = new javax.swing.JDialog();
jDialog2 = new javax.swing.JDialog();
jScrollPane2 = new javax.swing.JScrollPane();
jTabbedPane1 = new javax.swing.JTabbedPane();
jScrollPane1 = new javax.swing.JScrollPane();
reportTable = new javax.swing.JTable();
tName = new javax.swing.JTextField();
tSalary = new javax.swing.JTextField();
bAdd = new javax.swing.JButton();
bRemove = new javax.swing.JButton();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
tConnectStatus = new javax.swing.JLabel();
jMenuBar1 = new javax.swing.JMenuBar();
jTopMenu = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jLabel5.setText("jLabel5");
javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane());
jFrame1.getContentPane().setLayout(jFrame1Layout);
jFrame1Layout.setHorizontalGroup(
jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
jFrame1Layout.setVerticalGroup(
jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
javax.swing.GroupLayout jFrame2Layout = new javax.swing.GroupLayout(jFrame2.getContentPane());
jFrame2.getContentPane().setLayout(jFrame2Layout);
jFrame2Layout.setHorizontalGroup(
jFrame2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
jFrame2Layout.setVerticalGroup(
jFrame2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
javax.swing.GroupLayout jDialog1Layout = new javax.swing.GroupLayout(jDialog1.getContentPane());
jDialog1.getContentPane().setLayout(jDialog1Layout);
jDialog1Layout.setHorizontalGroup(
jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
jDialog1Layout.setVerticalGroup(
jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
javax.swing.GroupLayout jDialog2Layout = new javax.swing.GroupLayout(jDialog2.getContentPane());
jDialog2.getContentPane().setLayout(jDialog2Layout);
jDialog2Layout.setHorizontalGroup(
jDialog2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
jDialog2Layout.setVerticalGroup(
jDialog2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
reportTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null},
{null, null, null},
{null, null, null},
{null, null, null}
},
new String [] {
"Name", "Average Salary", "%"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.Integer.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
reportTable.getTableHeader().setReorderingAllowed(false);
jScrollPane1.setViewportView(reportTable);
reportTable.getColumnModel().getColumn(0).setMinWidth(300);
reportTable.getColumnModel().getColumn(0).setPreferredWidth(300);
reportTable.getColumnModel().getColumn(0).setMaxWidth(300);
reportTable.getColumnModel().getColumn(1).setMinWidth(100);
reportTable.getColumnModel().getColumn(1).setPreferredWidth(100);
reportTable.getColumnModel().getColumn(1).setMaxWidth(100);
reportTable.getColumnModel().getColumn(2).setMinWidth(100);
reportTable.getColumnModel().getColumn(2).setPreferredWidth(100);
reportTable.getColumnModel().getColumn(2).setMaxWidth(100);
jTabbedPane1.addTab("Report", jScrollPane1);
tSalary.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tSalaryActionPerformed(evt);
}
});
bAdd.setText("Add/Modify");
bAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bAddActionPerformed(evt);
}
});
bRemove.setText("Remove");
bRemove.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bRemoveActionPerformed(evt);
}
});
jLabel2.setText("Name");
jLabel3.setText("Salary");
tConnectStatus.setText("Disconnected");
jTopMenu.setText("File");
jMenuItem1.setText("Connect");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jTopMenu.add(jMenuItem1);
jMenuBar1.add(jTopMenu);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 530, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(27, 27, 27)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addGap(333, 333, 333))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(bRemove)
.addComponent(tName))
.addGap(18, 18, 18)))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tSalary, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3)
.addComponent(bAdd))
.addGap(37, 37, 37))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(tConnectStatus)
.addContainerGap(456, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 352, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(tName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(tSalary, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(bRemove)
.addComponent(bAdd))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tConnectStatus)
.addGap(6, 6, 6))
);
pack();
}// </editor-fold>
public void doConnect(final InetSocketAddress address)
{
clearUI();
if (address == null) {
tConnectStatus.setText("Disconnected");
return;
}
executor.execute(new Runnable() {
@Override
public void run() {
if (rUserRegistry.connect(address)) {
tConnectStatus.setText("Connected");
updateReportingView();
}
else
tConnectStatus.setText("Disconnected");
}
});
}
private void tSalaryActionPerformed(java.awt.event.ActionEvent evt) {
}
private void bAddActionPerformed(java.awt.event.ActionEvent evt) {
if (!rUserRegistry.isConnected())
return;
String strName = null;
if (tName.getText() != null && !"".equals(tName.getText())) {
strName = tName.getText().trim();
}
else
return;
String strSalary = tSalary.getText();
int salary = 0;
try {
salary = Integer.parseInt(strSalary);
}
catch (NumberFormatException excpt) {
return;
}
final String fName = strName;
final int fSalary = salary;
executor.execute(new Runnable() {
@Override
public void run() {
rUserRegistry.modify(new Employee(fName, fSalary));
updateReportingView();
tName.setText("");
tSalary.setText("");
}
});
}
private void bRemoveActionPerformed(java.awt.event.ActionEvent evt) {
if (!rUserRegistry.isConnected())
return;
if (tName.getText() != null && !"".equals(tName.getText())) {
final String fName = tName.getText().trim();
executor.execute(new Runnable() {
@Override
public void run() {
rUserRegistry.remove(fName);
updateReportingView();
tName.setText("");
tSalary.setText("");
}
});
}
}
private void clearUI() {
reportTable.setModel(new ReportTableModel(new ArrayList<Employee>(), 0));
tSalary.setText("");
tName.setText("");
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
connectDialog.setVisible(true);
}
private synchronized void updateReportingView() {
int maxSalary = rUserRegistry.getMaxSalary();
ReportTableModel tModel = new ReportTableModel(rUserRegistry.getEmployees(), maxSalary);
reportTable.setModel(tModel);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Windows".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(ManagerView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(ManagerView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(ManagerView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(ManagerView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ManagerView().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton bAdd;
private javax.swing.JButton bRemove;
private javax.swing.JDialog jDialog1;
private javax.swing.JDialog jDialog2;
private javax.swing.JFrame jFrame1;
private javax.swing.JFrame jFrame2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel5;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JMenu jTopMenu;
private javax.swing.JTable reportTable;
private javax.swing.JLabel tConnectStatus;
private javax.swing.JTextField tName;
private javax.swing.JTextField tSalary;
// End of variables declaration
}
