我发现我有几个地方设有公共静态内部类,扩展"帮助"类使我的代码更加类型安全,在我看来,可读.例如,假设我有一个"SearchCriteria"类.我搜索的不同内容有很多共性(搜索术语,然后是一组搜索术语类型,日期范围等).通过在静态内部类中扩展它,我将扩展和可搜索的紧密耦合在一起有特定差异的班级.这在理论上似乎是一个坏主意(Tight Coupling Bad!),但扩展特定于这个可搜索的类(One Class,One Purpose).
我的问题是,根据您的经验,使用静态内部类(或者您的语言等同于什么)使您的代码更具可读性/可维护性,或者最终在EOF中咬你?
此外,我不确定这是否是社区维基材料.
可能重复:
Java内部类和静态嵌套类
静态内部类的实例不能访问其封闭类的实例成员,而非静态内部类的实例可以.这就是我的意思是句法差异.因为将内部类声明为静态是否确定程序的语法是否正确.
但是有没有其他差异不属于Java语法?假设A类是顶级类,B类是A的内部类.如果我不打算在B中访问A的实例成员,那么我应该声明B是静态的.但由于我不需要,我可以声明B是非静态的,并且不会出现编译错误.那么在这种情况下,是否有任何差异,可能是在生成的字节码或任何运行时差异?
谢谢!
只是一个简短的问题:在我在android文档中看到的所有示例中,片段都是静态内部类.这是Android的要求吗?或者他们可以设置为常规内部类?是否有人了解Android的内部结构足以提供答案?
从我在OCJP文档中读到的内容来看,这些静态内部类根本不是类,而只是包含它们的类的静态成员,就像任何静态方法一样 - 例如main.
您的见解表示赞赏.
我有一个关于在以下代码中使用静态内部类的问题,改编自 Eckel's Thinking in Java 4th edition(第 625 页)。
该代码使用一个名为 Node.js 的静态内部类。创建堆栈结构时,您可以将节点推入堆栈并将它们弹出 - 到目前为止一切顺利。但是我对为什么节点类是静态的感到困惑?这不是意味着在 LinkedStack 类中只会创建一个 Node 吗?如何/为什么实际上您可以将许多不同的节点推入堆栈,然后将它们弹出(这当然是堆栈应该做的)。实际上,您可以更改private static class Node
为“私有类 Node”,它也可以工作……那么为什么 Eckels 选择静态类 Node?
在这个例子中,输入是三个单词“Phasers”、“on”、“stun!” 并且输出是“stun!”、“on”、“Phasers”。
public class LinkedStack<T> {
//generic inner class node
private static class Node<U> {
U item;
Node<U> next;
Node() {
item = null;
next = null;
}
Node(U item, Node<U> next) {
this.item = item;
this.next = next;
}
boolean isDummyNode() {
return item == null && next == null;
}
} …
Run Code Online (Sandbox Code Playgroud) 我知道一点java,多次使用final和static,但我在这里很安静:最终的A类和静态类B之间的基本区别是什么.我知道这些关键字.无法想象在类声明中使用final.
我得到了无法封闭的类型测试实例.必须使用类型测试错误的封闭实例限定分配,Location ob1 = new Location(10.0, 20.0);
我不知道为什么..
package pkg;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Location ob1 = new Location(10.0, 20.0);
Location ob2 = new Location(5.0, 30.0);
ob1.show();
ob2.show();
ob1 = ob1.plus(ob2);
ob1.show();
return;
}
public class Location // an ADT
{
private double longitude, latitude;
public Location(double lg, double lt) {
longitude = lg;
latitude = lt;
}
public void show() {
System.out.println(longitude + " " + latitude);
} …
Run Code Online (Sandbox Code Playgroud) 我习惯用C++编写代码,但必须将项目从C++转换为Java.在C++中使用数据结构非常简单.我试图复制相同的东西,但如Java内部类和静态嵌套类.在线阅读了几个例子,并尝试了不同的版本,到目前为止这是我得到的:
public class Main {
public static void main( String[] args ) {
...
ClassOuter outerObj = new ClassOuter();
ClassOuter.DataInner value = outerObj.new ClassOuter.DataInner();
}
}
class ClassOuter{
public static class DataInner{
public int x;
}
...
protected void getNo()
{ value.x=Integer.parseInt("493");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时,它给了我错误:
$ javac -cp "./" Main.java
Main.java:15: error: '(' expected
ClassOuter.DataInner value = outerObj.new ClassOuter.DataInner();
Run Code Online (Sandbox Code Playgroud)
关于这里缺少什么的任何线索?
在包java.util.LinkedList中,将类节点定义为一个静态类,是否有必要?目标是什么?
我们可以从此页面找到源代码。
我有一个主类"m"和2个内部类叫做sub1,sub2,其中sub2是静态类:
public class m
{
String n="n";
static String s="s";
public class sub1
{
public void fn(){System.out.println(n);}
//static public void fs(){System.out.println(s);}
}
static class sub2
{
//public void fn(){System.out.println(n);}
static public void fs(){System.out.println(s);}
}
public void f()
{
sub1 s1=new sub1();//OK, no error
sub2 s2=new sub2();//OK
}
public static void main(String[] args)
{
m obj=new m();
sub1 s1=new sub1();//Error
s1.fn();
//s1.fs();
sub2 s2=new sub2();//OK
//s2.fn();
s2.fs();
}
}
Run Code Online (Sandbox Code Playgroud)
我使用Openjdk在linux下编译它,它报告错误
$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14) …
Run Code Online (Sandbox Code Playgroud) 我试图在 android 中查看模型,所以对于 MainViewModel.java 我写了这个:
public class MainViewModel extends ViewModel {
private String textView;
private String editText;
//@Bindable
public String getTextView(){
return textView;
}
private void setTextView(String value){
textView=value;
}
//@Bindable
public TextWatcher getEditTextWatcher() {
return new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
setTextView(s.toString());
}
...
};
}
}
Run Code Online (Sandbox Code Playgroud)
在 ActivityMain.xml 中我写了这样的内容:
<TextView
android:text="View-Model / Data-Binding"
android:layout_width="match_parent"
android:layout_height="40dp"/>
<TextView
android:id="@+id/main_text_view"
android:text="@{mainvm.textView}"
android:layout_width="match_parent"
android:layout_height="40dp"/>
<EditText
android:id="@+id/main_edit_text"
app:textChangeListener="@{mainvm.editTextWatcher}"
android:layout_width="match_parent"
android:layout_height="40dp"/>
Run Code Online (Sandbox Code Playgroud)
我收到 2 个错误:
Cannot …
Run Code Online (Sandbox Code Playgroud) java ×8
class ×3
android ×2
inheritance ×1
instance ×1
linked-list ×1
mvvm ×1
nested ×1
nested-class ×1
non-static ×1
object ×1
oop ×1
static ×1
viewmodel ×1