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();

参考技术A 覆写完全因为继承而存在的,当继承而来的方法不能满足子类的需求时,子类就可以覆写掉父类的方法,用自己更漂亮的实现方式来代替老一辈的过时方法,俗称“青出于蓝”就是这么回事了 参考技术B …………什么类啊 接口?

为啥静态类在 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,如前所述,只允许publicabstractfinal

static主要用于类内部的方法和变量。

【讨论】:

【参考方案9】:

***类支持的访问修饰符如下:

1) 公开

2) 默认

3) 摘要

4) 最终

5) strictfp。

原因:***课程

因为static关键字是为了提供内存和执行逻辑而不创建对象,一个类没有直接的值逻辑,所以外部类不允许使用static关键字,主要是上面提到的static不能使用在包级别。它只在 Class 级别中使用。

【讨论】:

以上是关于java 里为啥有些类在生成对象的时候需要复写一些方法呢?这是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

为啥重写equals方法,一定要重写HashCode方法?

java 复写 意思

java一个疑问,为啥有些异常throw出去需要在函数头用throws声明,一些就不用。

使用java.util.UUID生成唯一标识,为啥生成唯一标识的方法有些还需要参数?

在调用一些Python里的函数的时候 为啥有些函数需要实例化有些不需要?

请问java里面为啥有时候声明对象的时候不用new??