通常,在我自己的项目中,我使用getter和setter进行任何字段访问,然后我按照我的工作做同样的事情.前段时间,我们项目的技术负责人问我为什么这样做,为什么这比仅仅使用字段本身更好(如果需要通过子类访问,可以选择声明它们受保护).我无法得出一个明确的答案.
那么,是否有任何理由在类的自己的字段中使用getter和setter,或者直接使用字段是否更好?
我试图找出某人的年龄.我按照这里给出的答案: 如何用Java计算某人的年龄?
这是我到目前为止:
public void setDOB(String day, String month, String year){
LocalDate birthDate = new LocalDate(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
}
Run Code Online (Sandbox Code Playgroud)
我在声明birthDate变量时遇到错误.我收到以下错误:LocalDate(int,int,int)在LocalDate中具有私有访问权限.我不知道这个错误意味着什么,但我假设它与数据访问有关(例如私人,公共等)
我想测试B类:
class B : A {
override fun init() {
// do work here
}
}
class A {
protected fun init() { } // will be called by internal logic
}
Run Code Online (Sandbox Code Playgroud)
并且在Java中调用没有问题:b.init()在测试方法中(测试类与测试对象在同一个包中),但在Kotlin编译器中抱怨:
无法访问'init':它在'B'中受到保护
@Test
fun `checks init`() {
val b = B()
b.init()
// assert work done
}
Run Code Online (Sandbox Code Playgroud)
为什么不工作?如何解决此问题(我想避免将方法公开)?
我开始学习java并在Eclipse中创建了我的第一个hello world函数.我注意到以下两个函数,都在我的java项目的src文件夹的默认包中,似乎做了同样的事情:
class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
两者都成功打印'Hello World!' 到控制台.
我已经阅读了一些关于不同类类型的内容,但我不确定我将使用第一个函数声明什么类型的类.这两个功能有什么区别?java在第一种情况下公开我的hello world class吗?
我正在尝试为矩形和椭圆形创建一个抽象形状类,我给形状赋予的唯一抽象方法是draw方法,但是在给它一个构造函数之后,矩形类中的所有内容给我一个错误,即颜色和其他变量具有私有访问权限,这是我的代码:
public abstract class Shape{
private int x, y, width, height;
private Color color;
public Shape(int x, int y, int width, int height, Color color){
setXY(x, y);
setSize(width, height);
setColor(color);
}
public boolean setXY(int x, int y){
this.x=x;
this.y=y;
return true;
}
public boolean setSize(int width, int height){
this.width=width;
this.height=height;
return true;
}
public boolean setColor(Color color){
if(color==null)
return false;
this.color=color;
return true;
}
public abstract void draw(Graphics g);
}
class Rectangle extends Shape{
public Rectangle(int x, int y, int …Run Code Online (Sandbox Code Playgroud) 我在StackOverflow中看到了关于这个主题的一些讨论,但我没有看到一些帮助我理解以下内容的东西:
我来自C++背景,最近我开始学习Java.在C++中,当使用protected时,只有子类可以访问该成员(类似于Java中的Field).
在C++中,还有"朋友"类可以访问提供"友谊"的类的私有/受保护的成员.这有点类似于Java中的"package"字段修饰符(默认字段修饰符),除了在C++中友谊提供对所有私有成员的访问,但在Java中,来自同一包中的类的访问特定于类字段.
我无法理解的是,假设我只想访问子类,我可以在C++中通过声明受保护的成员不会"给予"友谊来实现这一点.
但是在Java中,我不知道怎么做,因为通过使用"protected"字段修饰符 - 我还可以访问包中的所有类.我发现这样做的唯一方法是声明受保护的字段并将类隔离在其包中.
从这里,我得出的结论是,一个包中的类的分组必须基于类之间的"友谊"来完成. 这确实是包装分组中的主要考虑因素吗?
另一件我不明白的事情,在Java中,假设我在A类中有两个字段:b,c.我想给b访问b而不是c,我想给c访问c而不是b.而对于"世界"我想要b,c被隐藏.怎么做到呢?我猜B,C应该和A在同一个包中.但是通过使用包修饰符声明b,c 我让B,C访问b和c. Java中有没有办法做到这一点?
希望对这个问题有一些解释
什么时候应该在创建超类时使用Java中的Public over Protected,如果程序在没有任何问题的情况下运行受保护的访问修饰符集,是否需要将其更改为Public?
这是我的代码片段:
public class Test {
public static void main(String[] args) {
class EnglishHelloThere {
int a=10;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个本地类,以便在编译器中没有为本地类中的变量编写任何修饰符时,查看访问修饰符的类型.
这就是我在JAVAP中得到的
Compiled from "Test.java"
class com.Test$1EnglishHelloThere
SourceFile: "Test.java"
EnclosingMethod: #21.#23 // com.Test.main
InnerClasses:
#27= #1; //EnglishHelloThere=class com/Test$1EnglishHelloThere
minor version: 0
major version: 51
flags: ACC_SUPER
Constant pool:
#1 = Class #2 // com/Test$1EnglishHelloThere
#2 = Utf8 com/Test$1EnglishHelloThere
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 a
#6 = Utf8 I
#7 = Utf8 <init>
#8 …Run Code Online (Sandbox Code Playgroud) 我正在学习 Java,有一些事情困扰着我,教科书没有解释它。
我知道您使用修饰符来声明类和所有内部的方法。但我突然上了一堂课,宣布像
static void(){
}
Run Code Online (Sandbox Code Playgroud)
为什么没有 public 或 private 修饰符,它仍然有效?我可以避免在其他地方使用 public 修饰符吗,或者它是如何工作的?我知道静态意味着该类的成员,而它不返回值则表示无效。然而,为什么不是公共或私人的。
我有一个类的 ArrayList,如下所示:
public class Person {
String name;
String age
List<String> education = new ArrayList<String> ();
List<String> family = new ArrayList<String> ();
List<String> previousjobs = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)
我想将此列表编写为 Json 并尝试使用以下代码:
Writer out = new PrintWriter("./test.json");
mapper.writerWithDefaultPrettyPrinter().writeValueas(out, persons);
Run Code Online (Sandbox Code Playgroud)
并收到此错误消息:
没有找到类~~~~~~ 的序列化器,也没有发现创建 BeanSerializer 的属性(为了避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过引用链:java.util.ArrayList[0])`
我尝试添加,mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)但由于某些未知原因,它使所有人员对象都为空。
我怎么了?