java 里为啥有些类在生成对象的时候需要复写一些方法呢?这是怎么回事?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 里为啥有些类在生成对象的时候需要复写一些方法呢?这是怎么回事?相关的知识,希望对你有一定的参考价值。
因为这个类是抽象类,而抽象类不能直接被实例化,必须先实现抽象类中的所有抽象方法才可以创建这个类的对象。在创建抽象类的匿名对象时,往往会在类题中重写一些方法追问
抽象类不是不能生成对象吗?怎么还能new吗?
追答import java.util.*;
class Test
public static void main(String[] args)
String res = new AbsClass()
public String getDate()
return new Date().toLocaleString();
.getDate();
System.out.println(res);
abstract class AbsClass
public abstract String getDate();
为啥静态类在 Java 中是非法的?
【中文标题】为啥静态类在 Java 中是非法的?【英文标题】:Why is a static class illegal in Java?为什么静态类在 Java 中是非法的? 【发布时间】:2012-08-03 15:09:02 【问题描述】:我正在开发一个 Android 应用程序,但遇到了一些问题,我不断收到错误消息:
Illegal modifier for the class FavsPopupFragment; only public, abstract & final are permitted
这发生在关注 this answer 到另一个 SO 问题之后。这是我的代码:
package com.package.name;
/* Imports were here */
public static class FavsPopupFragment extends SherlockDialogFragment
static FavsPopupFragment newInstance()
FavsPopupFragment frag = new FavsPopupFragment();
return frag;
错误出现在类名上。我不明白为什么这不起作用,请帮助。谢谢。
【问题讨论】:
在这种情况下,您必须确保或强迫自己将FavsPopupFragment
放入另一个类中。
对我来说,我正在看这个问题的原因是我来自 C#/.Net,在那里你可以拥有静态***类。尽管事实证明“静态”在两种技术中意味着两种不同的东西。
【参考方案1】:
您不能创建***静态类;这就是编译器试图告诉你的。另请查看here 的答案,了解为什么会出现这种情况。要点是:
静态归结为类的实例可以 独立存在。或者,反过来:非静态内部类 (=实例内部类)没有外部实例就不能存在 班级。由于***类没有外部类,它不能 绝不是静态的。
因为所有***类都是静态的,所以在 ***类定义毫无意义。
【讨论】:
【参考方案2】:正如前面的答案所述,您不能在***类中使用 static 关键字。但我想知道,你为什么希望它是静态的?
让我向您展示如何在示例中使用静态/非静态内部类:
public class A
public class B
public static class C
public static void foo()
B b = new B(); //incorrect
A a = new A();
A.B b = a.new B(); //correct
C c = new C(); //correct
public void bar()
B b = new B();
C c = new C(); // both are correct
而且来自一个完全不同的班级:
public class D
public void foo()
A.B b = new A.B() //incorrect
A a = new A()
A.B b = a.new B() //correct
A.C c = new A.C() //correct
【讨论】:
【参考方案3】:1. static
不能用于Package level.
2.static
可能在类级别内。
3.但是当类是inner class
时,您仍然可以在类上使用静态,即。 (static inner class)
,俗称***类。
【讨论】:
【参考方案4】:根据定义,***类已经是***的,因此将其声明为静态没有意义;这样做是错误的。编译器会检测并报告这个错误。
【讨论】:
【参考方案5】:从类定义中删除静态。只有嵌套的classes 可以是静态的。
对于 FavsPopupFragment 类;只有 public、abstract 和 final 是 允许
【讨论】:
【参考方案6】:我认为您不能使用 new 关键字创建静态类的实例。无论如何,这是一个片段,所以它可能不应该是静态的。
【讨论】:
【参考方案7】:您不能对***类使用static
修饰符,尽管可以使用static
关键字修改嵌套类。
在这种情况下,您需要删除静态修饰符,或者确保该类嵌套到另一个***类中。
额外信息
没有静态类这样的东西。这里的静态修饰符 case (static nested) 表示嵌套类是外部类的静态成员。 这意味着它可以像其他静态成员一样被访问,而无需 有一个外部类的实例。
就像静态方法不能访问实例变量一样 和类的非静态方法,静态嵌套类不 可以访问实例变量和非静态方法 外部类
【讨论】:
【参考方案8】:static
可用于内部类级别。***不能是static
,如前所述,只允许public
、abstract
和final
。
static
主要用于类内部的方法和变量。
【讨论】:
【参考方案9】:***类支持的访问修饰符如下:
1) 公开
2) 默认
3) 摘要
4) 最终
5) strictfp。
原因:***课程
因为static关键字是为了提供内存和执行逻辑而不创建对象,一个类没有直接的值逻辑,所以外部类不允许使用static关键字,主要是上面提到的static不能使用在包级别。它只在 Class 级别中使用。
【讨论】:
以上是关于java 里为啥有些类在生成对象的时候需要复写一些方法呢?这是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章
java一个疑问,为啥有些异常throw出去需要在函数头用throws声明,一些就不用。
使用java.util.UUID生成唯一标识,为啥生成唯一标识的方法有些还需要参数?