Определение методов и переменных

Я новичок, и я пытаюсь понять, что такое статическое, частное, публичное. Пожалуйста, см. Следующий пример, написанный мной. Это работает, но у меня есть очень большие сомнения в том, что это правильный способ определения переменных и методов. Заранее спасибо!

import java.util.Scanner;
import java.util.Date; 
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Biorhytm {

private static String nameOne;
private static String nameTwo;
private static String dobOneIn;
private static String dobTwoIn;
private static Date dobOne;
private static Date dobTwo;
static int diff;

public static Date getDobOne() {
 return dobOne;
 }

public static void setDobOne(Date dobOne) {
 Biorhytm.dobOne = dobOne;
 }

public static Date getDobTwo() {
 return dobTwo;
 }

public static void setDobTwo(Date dobTwo) {
 Biorhytm.dobTwo = dobTwo;
 }

public static String getDobOneIn() {
 return dobOneIn;
 }

public static void setDobOneIn(String dobOneIn) {
 Biorhytm.dobOneIn = dobOneIn;
 }

public static String getDobTwoIn() {
 return dobTwoIn;
 }

public static void setDobTwoIn(String dobTwoIn) {
 Biorhytm.dobTwoIn = dobTwoIn;
 }

public static String getNameOne() {
 return nameOne;
 }

public static void setNameOne(String nameOne) {
 Biorhytm.nameOne = nameOne;
 }

public static String getNameTwo() {
 return nameTwo;
 }

public static void setNameTwo(String nameTwo) {
 Biorhytm.nameTwo = nameTwo;
 }

public static int diffCalc() {
 return diff = Math.abs((int)((getDobOne().getTime() - getDobTwo().getTime()) / (24 * 60 * 60 * 1000)));
}

public static void main(String[] args) {

 float physicalBio;
 float emotionalBio;
 float intellectualBio;
 boolean validEntry;

 Scanner input = new Scanner(System.in);

 SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
 SimpleDateFormat format2 = new SimpleDateFormat("EEEE, MMMM d, yyyy", java.util.Locale.US);

 System.out.println("Enter name of first person!");
 setNameOne(input.nextLine());

 if (getNameOne().equals("")) {
 setNameOne("first person");
 }

 System.out.println("Enter name of second person!");
 setNameTwo(input.nextLine());

 if (getNameTwo().equals("")) {
 setNameTwo("second person");
 }

 do {
 try {
 System.out.println("Enter date of birth of " + getNameOne() + "! (MM/DD/YYYY)");
 setDobOneIn(input.nextLine());
 setDobOne(format.parse(getDobOneIn()));
 validEntry = true;
 }
 catch (ParseException e) {
 validEntry = false;
 }
 } while (!validEntry);

 do {
 try {
 System.out.println("Enter date of birth of " + getNameTwo() + "! (MM/DD/YYYY)");
 setDobTwoIn(input.nextLine());
 setDobTwo(format.parse(getDobTwoIn()));
 validEntry = true;
 }
 catch (ParseException e) {
 validEntry = false;
 }
 } while (!validEntry);

 System.out.println();
 System.out.println("DOB of " + getNameOne() + ": " + format2.format(getDobOne()) + ".");
 System.out.println("DOB of " + getNameTwo() + ": " + format2.format(getDobTwo()) + ".");
 System.out.println("Difference between DOBs (days): " + diffCalc() + ".");

 physicalBio = diffCalc() % 23;
 emotionalBio = diffCalc() % 28;
 intellectualBio = diffCalc() % 33;

 physicalBio /= 23;
 emotionalBio /= 28;
 intellectualBio /= 33;

 if (physicalBio > 0.5) {
 physicalBio = 1 - physicalBio;
 }

 if (emotionalBio > 0.5) {
 emotionalBio = 1 - emotionalBio;
 }

 if (intellectualBio > 0.5) {
 intellectualBio = 1 - intellectualBio;
 }

 physicalBio = 100 - (physicalBio * 100);
 emotionalBio = 100 - (emotionalBio * 100);
 intellectualBio = 100 - (intellectualBio * 100);

 System.out.println("Physical compatibility: " + java.lang.Math.round(physicalBio) + " %.");
 System.out.println("Emotional compatibility: " + java.lang.Math.round(emotionalBio) + " %.");
 System.out.println("Intellectual compatibility: " + java.lang.Math.round(intellectualBio) + " %.");

}

}
2 ответа

Вы предпочли бы, чтобы ваш класс Biorhythm был чем-то, представляющим данные об одном человеке. Поэтому вы должны создать два экземпляра (назовите их "один" и "два", скажем) и сделайте их non- static. Он будет иметь переменные экземпляра, а не статические переменные, представляющие имя и дату рождения.

class Biorhythm {
 private Date dob;
 private String name;

 Biorhythm(String name, Date dob) {
 this.name = name;
 this.dob = dob;
 }

 public String getName() {
 return name;
 }

 public Date getDob() {
 return dob;
 }
}

public static void main(String[] args) {
 Date onedob = /* implementation omitted */
 Biorhythm one = new Biorhythm("maxval", onedob);
 System.out.println("one: name=" + one.getName() + " date=" + one.getDob());
 /* and so forth */
}

Вам действительно не нужны методы setXXX(), потому что эти значения, вероятно, не изменятся в вашей программе.

Теперь создайте два экземпляра этого класса в вашем методе main(). В настоящее время я оставлю реализацию методов расчета как упражнение, так как для их реализации было бы несколько достойных проектов (с точки зрения объектно-ориентированного вопроса, который вы задали).


Сначала позвольте мне объяснить, что эти ключевые слова are- private, default, protected.public являются ДОСТУПНЫМИ КОНЦЕПЦИЯМИ. общественность, как говорится в слове, может быть доступна повсюду, и все участники могут быть публичными. protected - можно получить за пределами пакета в случае наследования. доступ по умолчанию доступен в пакете, и все участники могут быть по умолчанию. private-scope лежит внутри класса, не может быть унаследован. И помните, что они могут использоваться с переменными, методами, даже классами.

static - может использоваться, когда нет необходимости вызывать методы или обращаться к переменным с объектами. статические члены не принадлежат объекту и инициализируются во время загрузки класса. например:

класс Конвертер {
public static long convert (long val) {
return val;
}
class User {
long value = Converter.convert(500);//вызов преобразования с именем класса}

licensed under cc by-sa 3.0 with attribution.