Как связать два класса между собой?
Привет,помогите разобраться с связью классов,было задание про составление файла с результатами ведомости,мне помогли с заданием тут => Запись в файл результатов сессии,и работа с ними но я запутался и не смог разобраться как мне связать между собой два класса.Пытался найти информацию в интернета,ничего из найденного не помогло,подскажите как их можно связать между собой?
Класс Student:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
package help; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author i++ */ public class Student implements Serializable{ private static final long serialVersionUID = 3765822376456735833L; private String name; private String famyly; private ArrayListPredmet> predmet = new ArrayListPredmet>(); public Student(String name, String family){ this.name = name; famyly = family; } /*добавляем оценку*/ public void addOcenka(String pred, int oc){ boolean yes = false; for(int i = 0; i predmet.size(); i++){ if(pred.equals(predmet.get(i).getName())){ predmet.get(i).addOcinka(oc); yes = true; break; } } if(!yes){ predmet.add(new Predmet(pred)); addOcenka(pred, oc); } } /*добавляем оценкu*/ public void addOcenka(String pred, int[] oc){ boolean yes = false; for(int i = 0; i predmet.size(); i++){ if(pred.equals(predmet.get(i).getName())){ for(int a = 0; a oc.length; a++){ predmet.get(i).addOcinka(oc[a]); } yes = true; break; } } if(!yes){ predmet.add(new Predmet(pred)); addOcenka(pred, oc); } } /*СОХРАНЯЕМ СТУДЕНТА*/ public void save(){ try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(name + "_" + famyly + ".cls"))){ oos.writeObject(this); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } /*СОХРАНЯЕМ СТУДЕНТА в тхт*/ public void saveAsTxt(){ String[][] s = new String[predmet.size()][]; for(int i = 0; i predmet.size(); i++){ s[i] = predmet.get(i).getStatistac();//собираем масив } int i = getMaxLength();//узнаем максимальную длину int ml = getMaxString();//кзнаем максимальную длину строки //пересобираем строку String str = ""; for(int a = 0; a s.length; a++){ for(int b = 0; b i; a++){ if(b s[a].length - 1){ for(int c = 0; c ml - s[a][b].length(); c++){ str += ""; } str += s[a][b] + " | "; } else{ for(int c = 0; c ml - s[a][b].length(); c++){ str += ""; } str += " | "; } str += "\n"; } } try { //Записываем строку в файл PrintWriter pw = new PrintWriter(famyly + "_" + name + ".txt", "utf-8"); //pw.write(str); pw.println(str); pw.close(); } catch (FileNotFoundException ex) { Logger.getLogger(Student.class.getName()).log(Level.SEVERE, null, ex); } catch (UnsupportedEncodingException ex) { Logger.getLogger(Student.class.getName()).log(Level.SEVERE, null, ex); } } private int getMaxLength() { int a = 0; for(int i = 0; i predmet.size(); i++){ int b = predmet.get(i).getStatistac().length; if(b > a){ a = b; } } return a; } /*private int getMaxString() int i = 0; return i;*/ } }
Класс Predmet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
package help; import java.io.Serializable; import java.util.ArrayList; /** * * @author i++ */ public class Predmet implements Serializable{ private static final long serialVersionUID = 3765822376456735823L; private String name; private ArrayListInteger> oc = new ArrayListInteger>(); private int min; public Predmet(String name){ this.name = name; } /*добавляем оценку*/ public void addOcinka(int i){ oc.add(i); } /*получаем полную выписку оценок студиоза по предмету*/ public String[] getStatistac(){ String[] s = new String[oc.size() + 2]; s[0] = name; for(int i = 0; i oc.size(); i++){ s[i + 1] = "" + oc.get(i).intValue(); } s[s.length - 1] = "" + this.getCoefUsp(); return s; } /*вычисляем коефициент успеваемости больше нуля - хорошо, мпеньше - хреново*/ public double getCoefUsp(){ return getBestOc() - getHuyoviOc(); } public void setProhodMinimum(int i){ min = i; } private double getBestOc() { double sum = 0d; for(int i = 0; i oc.size(); i++){ if(oc.get(i).intValue() >= min){//любое число как проходной минимум для вашей системы образования. //задаем методом setProhodMinimum(int i) sum += oc.get(i).intValue(); } } return sum / oc.size(); } private double getHuyoviOc() { double sum = 0d; for(int i = 0; i oc.size(); i++){ if(oc.get(i).intValue() min){//любое число как проходной минимум для вашей системы образования. //задаем методом setProhodMinimum(int i) sum += oc.get(i).intValue(); } } return sum / oc.size(); } public String getName() { return name; } }
Объединение нескольких классов в один
(Честно говоря тему не смог точно сформулировать)
В общем суть проблемы такова:
мне надо создать некий класс MY_OBJ
каждый элемент этого класса мог бы быть либо кнопкой(JButton) либо текстовым полем(JTextField) ну и пусть еще меткой(JLabel) пока все.
Помимо этого у каждого элемента есть набор параметров.
Вот, и как это сделать я пока не знаю.
Поясню кодом свою текущую ситуацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
public class MyBtn extends JButton { MyBtn(int id) { Index = id; } int Index; // + др. параметры } public class MyTxt extends JTextField { MyTxt(int id) { Index = id; } int Index; // + др. параметры } public class MyLbl extends JLabel { MyLbl(int id) { Index = id; } int Index; // + др. параметры }
Как видно у меня щас три класса, но хотелось(точнее хотелось бы не мне а начальнику => это необходимо) бы их объединить в один.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Объединение нескольких классов в один namespace
Имеется, к примеру 4 класса. У каждого отдельными файлами идут хедеры и сами сипипишники. Вопрос.
EF CodeFirst Объединение нескольких классов в одну таблицу
Народ подскажите, как сделать. Надо сделать одну таблицу с кучей полей. Чтобы было удобно я решил.
Объединение экземпляров 2х классов один список
Здравствуйте, есть задача объединить эекземпляры 2х классов в один список , что бы отсортировать.
Объединение макросов и несколько классов в один файл
Здравствуйте! У меня есть 2 макроса и 2 класса, которые необходимо использовать вместе, а.
Регистрация: 07.03.2011
Сообщений: 117
не понял задачу. Нужно сделать так, чтобы объект твоего класса мог быть кнопкой, текстовым полем или чем нибудь еще + общая часть?
Регистрация: 30.06.2011
Сообщений: 173
2 Lamer George
Да совершенно верно
Регистрация: 07.03.2011
Сообщений: 117
Ну, можно, например, пойти таким путем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
import javax.swing.*; import java.awt.*; public class Test { public static void main(String[] args) { final JFrame frame = new JFrame('Form'); final JPanel p = new JPanel(); p.setLayout(new GridLayout(1,2)); frame.setContentPane(p); frame.setSize(200, 200); UniversalComponent uc1 = new UniversalComponent(0); p.add(uc1.getComponent()); UniversalComponent uc2 = new UniversalComponent(3); p.add(uc2.getComponent()); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.show(); } } class UniversalComponent { private int i; public int getI() {return this.i; } public void setI(int i) {this.i = i; } private JComponent comp; private int typeNumber; UniversalComponent(int type) { setComponentType(type); } public void setComponentType(int type) { typeNumber = type; switch(type) { case 0: comp = new JButton('Button'); break; case 1: comp = new JTextArea(); break; case 2: comp = new JTree(); break; default: comp = new JLabel('Label'); break; } } public JComponent getComponent() { return this.comp; } }
UniversalComponent в данном случае может содержать любой Swing-компонент. Возможны и другие решения.
Регистрация: 30.06.2011
Сообщений: 173
2 Lamer George
Спасибо за код, в принципе про подобный вариант я думал. Но при этом меня смущает следующее:
Допустим(используя твой код) я хочу повесить на кнопку ‘uc1’ событие типа такого:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
((JButton)uc1.comp).addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent evnt) { // здесь таким кодом я получу доступ к кнопке Object obj = evnt.getSource(); // теперь через код ((JButton)obj) // я могу получить доступ к кнопке // НО как теперь получить доступ к объекту uc1 класса UniversalComponent // у которого собственно и находится в свойствах // эта кнопка } });
В общем как имея переменную ‘evnt’ получить доступ например к полю ‘typeNumber’.
Ну, например, можно сделать UniversalComponent ActionListenerом
и слушать кнопку.
А впоймав событие, творить новый ActionEvent и передавать его уже своим ActionListenerам.
Для этого надо соответственно в UniversalComponent сделать метод
addActionListener.
А еще лучше написать UniversalComponentListener.
Регистрация: 07.03.2011
Сообщений: 117
Если сделать переменные final, то, например, так:
1 2 3 4 5 6 7 8 9
final UniversalComponent uc1 = new UniversalComponent(0); p.add(uc1.getComponent()); ((JButton) uc1.getComponent()).addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent evnt) { System.out.println(uc1.getI()); } });
А Вы не пробовали все это творить с помощью интерфейсов? или абстрактного класса, который в свою очередь наследует Component. Наверное это будет гораздо лакончнее.
Регистрация: 30.06.2011
Сообщений: 173
2 unknown
Извените, а можно ‘код в студию’ — маленький примерчик.
Регистрация: 07.03.2011
Сообщений: 117
Вариант с интерфейсами может выглядеть подобным образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class Test { public static void main(String[] args) { final JFrame frame = new JFrame('Form'); final JPanel p = new JPanel(); p.setLayout(new GridLayout(1, 2)); frame.setContentPane(p); frame.setSize(200, 200); final MyInterface myComp1 = new MyButton('Button'); p.add((MyButton)myComp1); final MyInterface myComp2 = new MyLabel('Label'); p.add((MyLabel)myComp2); ((MyButton)myComp1).addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent evnt) { System.out.println(myComp1.getI()); System.out.println(myComp2.getI()); } }); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.show(); } } class MyButton extends JButton implements MyInterface { MyButton(String str) { super(str); } private int i; public int getI() { return this.i; } public void setI(int i) { this.i = i; } public int getComponentTypeNumber() { return 1; } } class MyLabel extends JLabel implements MyInterface { private int i; MyLabel(String str) { super(str); } public int getI() { return this.i; } public void setI(int i) { this.i = i; } public int getComponentTypeNumber() { return 2; } }
по-моему овчинка не стоит выделки.
весь приведенный выше код не имеет практической ценности. нафиг писать какой то универсальный контейнер для 3-х элементов, если можн их применять по-отдельности?
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Объединение нескольких столбцов в один
Добрый день, уважаемые форумчане. Возникла следующая проблема: Необходимо из таблицы "Сводная" из.
Объединение нескольких файлов в один
Доброго дня! Сразу скажи что в экселе не очень силён. По работе требуется создавать множество.
Объединение нескольких файлов в один
Здравствуйте! Нужно объединить несколько файлов Excel с таблицами одинаковой структуры.
Объединение нескольких листов в один
Всем, добрый день. Возник довольно известный вопрос, но решения не удалось найти, перепробовал.
Кофе-брейк #260. Традиционное и современное сопоставление с образцом. Как объединить сопоставление с образцом с запечатанными классами. Что такое запечатанные интерфейсы
Источник: FreeCodeCamp Эта публикация посвящена вопросу улучшения качества кода Java с помощью сопоставления с образцом и запечатанными классами. Pattern Matching (Сопоставление с образцом) позволяет писать более лаконичный и читаемый код Java при работе со сложными структурами данных. Также оно упрощает извлечение данных из структур данных и выполнение операций над ними.
Что такое сопоставление с образцом в Java?
Pattern Matching сопоставляет значение с шаблоном, который включает переменные и условия. Если значение соответствует шаблону, соответствующие части значения привязываются к переменным в шаблоне. Это позволяет создавать более читаемый и интуитивно понятный код. Существует два типа сопоставления с образцом: традиционный и современный. Давайте посмотрим на различия между ними.
Традиционное сопоставление с образцом
При традиционном сопоставлении с образцом оператор switch расширяется для поддержки сопоставления с образцом путем добавления ключевого слова case с аргументом шаблона. Оператор switch может сопоставляться с примитивным типом, оболочками, перечислениями и строками. Пример кода:
private static void printGreetingBasedOnInput(String input) < switch (input)< case "hello": System.out.println("Hi There"); break; case "goodbye": System.out.println("See you Later!"); break; case "thank you": System.out.println("You are welcome"); break; default: System.out.println("I don't understand"); break; >>
Здесь метод printGreetingBasedOnInput принимает строку input и печатает соответствующее приветственное сообщение на основе ее значения с помощью операторов switch-case . Он охватывает случаи “hello” “goodbye” и “thank you”, предоставляет соответствующие ответы и по умолчанию использует “I don’t understand” (Я не понимаю) для любых других входных данных.
Современное сопоставление с образцом
В современном сопоставлении с образцом оператор switch может сопоставляться с различными шаблонами, такими как объекты любого типа, перечисления или примитивы. Ключевое слово case используется для указания шаблона для сопоставления.
private static void printGreetingBasedOnInput(String input) < switch (input)< case "hello" ->System.out.println("Hi There"); case "goodbye" -> System.out.println("See you Later!"); case "thank you" -> System.out.println("You are welcome"); default -> System.out.println("I don't understand"); > >
В этом фрагменте используется более краткий синтаксис. Это упрощает код, напрямую указывая действие, которое необходимо выполнить для каждой метки case . До Java 16 нам нужно было проверять тип объекта, а затем явно приводить его к переменной. Расширенный оператор instanceof , представленный в Java 16, может как проверять тип, так и выполнять неявное приведение к переменной, как в примере ниже:
private static void printType(Object input) < switch (input) < case Integer i ->System.out.println("Integer"); case String s -> System.out.println("String!"); default -> System.out.println("I don't understand"); > >
Улучшение instanceof становится особенно полезным при работе с защитой шаблонов (pattern guards). Защита шаблонов — это способ сделать операторы case в сопоставлении шаблонов Java более конкретными за счет включения логических выражений (boolean expressions). Это обеспечивает более точный контроль над сопоставлением шаблонов и может сделать ваш код более читабельным и выразительным.
private static void printType(Object input) < switch (input) < case Integer i && i >10 -> System.out.println("Integer is greater than 10"); case String s && !s.isEmpty()-> System.out.println("String!"); default -> System.out.println("Invalid Input"); > >
- Оно улучшает читаемость кода, позволяя эффективно сопоставлять значения с шаблонами и извлекать данные.
- Оно уменьшает дублирования кода, обрабатывая различные случаи (cases) с помощью одного фрагмента кода.
- Оно повышает безопасность типов, позволяя сопоставлять значения с конкретными типами.
- Защитники шаблонов (Pattern guards) могут использоваться в case для дальнейшего улучшения читаемости и удобства сопровождения кода.
Что такое запечатанные классы в Java?
Запечатанные классы (Sealed Classes) позволяют разработчикам ограничивать набор классов, которые могут расширять или реализовывать данный класс или интерфейс. С помощью запечатанных классов можно создать иерархию классов или интерфейсов, которую затем можно расширить или реализовать только с помощью определенного набора классов. Например:
public sealed class Result permits Success, Failure < protected String response; public String message()< return response; >> public final class Success extends Result < @Override public String message() < return "Success!"; >> public final class Failure extends Result < @Override public String message() < return "Failure!"; >>
В этом примере мы определили запечатанный класс Result , который можно расширить с помощью классов Success или Failure . Любой другой класс, который попытается расширить Result , приведет к ошибке компиляции. Это дает нам возможность ограничить набор классов, которые можно использовать для расширения Result , делая код более удобным в сопровождении и расширяемым.
Несколько важных моментов, которые стоит учесть:
- Если подкласс хочет быть разрешенным подклассом запечатанного класса в Java, он должен быть определен в том же пакете, что и запечатанный класс. Если подкласс не определен в том же пакете, то произойдет ошибка компиляции.
- Если подклассу разрешено расширять запечатанный класс в Java, он должен иметь один из трех модификаторов: final , sealed (запечатанный) или non-sealed (незапечатанный).
- Запечатанный подкласс должен определять тот же или более ограничительный набор разрешенных подклассов, что и его запечатанный суперкласс. Запечатанные подклассы должны быть либо final , либо sealed . Незапечатанные (non-sealed) подклассы не допускаются в качестве разрешенных подклассов запечатанного. суперкласса, и все разрешенные подклассы должны принадлежать к тому же пакету, что и запечатанный суперкласс.
Как объединить сопоставление шаблонов Java и запечатанные классы
Вы можете использовать запечатанные классы и их разрешенные подклассы в операторах switch с сопоставлением шаблонов. Это может сделать ваш код более кратким и легким для чтения. Взгляните на пример:
private static String checkResult(Result result) < return switch (result) < case Success s ->s.message(); case Failure f -> f.message(); default -> throw new IllegalArgumentException("Unexpected Input: " + result); >; >
В случае запечатанных классов компилятору требуется ветвь по умолчанию (default branch) для сопоставления с образцом, чтобы обеспечить охват всех возможных случаев. Поскольку запечатанные классы имеют фиксированный набор разрешенных подклассов, все случаи можно охватить с помощью конечного числа операторов case . Если ветвь по умолчанию не включена, в будущем в иерархию можно добавить новый подкласс, который не будет охватываться существующими операторами case . Это приведет к ошибке выполнения, которую будет сложно отладить. Требуя ветвь по умолчанию, компилятор гарантирует, что код является полным и охватывает все возможные случаи, даже если в будущем к иерархии запечатанных классов будут добавлены новые подклассы. Это помогает предотвратить ошибки во время выполнения и делает код более надежным и удобным в сопровождении. Если мы изменим класс Result, включив в него новый подкласс Pending , и мы не включили его в сопоставление с образцом, он будет включен в ветвь по умолчанию.
Что такое запечатанный интерфейс в Java?
При работе с запечатанным интерфейсом в Java компилятору не потребуется ветка по умолчанию для сопоставления с образцом, если охвачены все случаи. В случае отсутствия ветки компилятору потребуется ветка по умолчанию, чтобы гарантировать обработку всех возможных случаев. Помните, что при работе с запечатанными классами нам всегда необходимо включать ветку по умолчанию. Вот пример кода:
public sealed interface OtherResult permits Pending, Timeout < void message(); >public final class Pending implements OtherResult < @Override public void message() < System.out.println("Pending!"); >> public final class Timeout implements OtherResult < @Override public void message() < System.out.println("Timeout!"); >> private static void checkResult(OtherResult result) < switch (result) < case Pending p ->p.message(); case Timeout t -> t.message(); >; >
Заключение
- Улучшенная читаемость : сопоставление с образцом и запечатанные классы могут сделать ваш код более выразительным и легким для чтения, поскольку они обеспечивают более краткий и интуитивно понятный синтаксис.
- Лучший контроль над иерархиями классов . Запечатанные классы позволяют iконтролировать иерархии классов и гарантировать возможность использования только разрешенных подклассов. Это может улучшить безопасность и удобство сопровождения кода.
- Неявная безопасность типов . Сопоставление с образцом и запечатанные классы обеспечивают неявную безопасность типов, что может снизить риск ошибок во время выполнения и упростить поддержку кода.
- Уменьшение дублирования кода . Сопоставление с образцом и запечатанные классы могут уменьшить дублирование кода, позволяя обрабатывать различные случаи в одном фрагменте кода.
- Лучшая организация кода . Запечатанные классы могут помочь организовать код и уменьшить сложность иерархии классов за счет группировки связанных классов.
- Улучшение удобства сопровождения . Сопоставление с образцом и запечатанные классы могут улучшить удобство сопровождения кода, упрощая его понимание и обновление, что может сэкономить время и усилия в долгосрочной перспективе.
Как объединить классы в java? Как с этих кусков кода сделать один проект?
У меня есть три класса (TypeByte, Types, Operators). Код каждого класса я написала, отдельными проектами работает, в одном проекте нет.
22 мар 2018 в 22:49
Из кода и вопроса не понятно какую цель вы преследуете. Если просто объединить файлы, то ctrl+c cltr+v вам в помощь. Иначе поясните как эти классы должны взаимодействовать и что вообще делает ваш проект.
22 мар 2018 в 23:17
Чтобы этого добиться вам требуется освоить базовые принципы ООП, разнести данные по полям и логику по методам, оставив в единственном методе main всего пару-тройку строк кода. Сейчас ваш код сложно назвать даже процедурным.