Java中类变量可以被继承吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中类变量可以被继承吗相关的知识,希望对你有一定的参考价值。

我对Java中static这个关键字的概念很模糊,有以下问题想不通,希望知道的告诉我,谢谢了。:
1、父类中创建了类变量,它的子类可以继承吗?
2、如果在父类中有成员变量public int a,那么在子类里定义类变量public static int a,那么在子类里访问a的话,访问到的是哪一个呢?子类的类变量会覆盖继承而来的成员变量a吗?
谢谢,我实在很迷茫!

一,java子类可以继承父类所有的属性变量。private也能被继承但是不能被访问;可以通过public在父类调用。
二,子类继承父类时,需要注意以下三点:
1、在子类继承父类的时候,子类必须调用父类的构造函数。
2、如果父类有默认构造函数,子类实例化时自动调用,但如果父类没有默认构造函数,即无形参构造函数,子类构造函数必须通过super调用父类的构造函数。
3、在java的继承当中子类是不可以继承父类的构造函数,只能调用父类的构造函数。
参考技术A 1.当然能了
请看一下程序:

public class A

int i= 10;



class B extends A

public static void main(String[] args)

B b = new B();

System.out.println(b.i);


运行结果:10

2.不会
请看一下程序:

public class A

public int i= 10;



class B extends A

public static int i = 5;

public static void main(String[] args)

B b = new B();

System.out.println(b.i);


运行结果:5
所以说不会覆盖,但是当类B中没有定义i时,
输出就会是A类中i的值。
还有静态方法不能重写。
比如以上程序中A类中有函数public int f()
而B类中出现函数public static int f()时,
就会出现编译错误。

我觉得这类问题你最好装一个java编译器Jcreator
自己运行一下印象会比较深刻。
参考技术B 只要是非私有的子类都能继承。
覆盖有个原则就是“非静态的被覆盖,静态的被隐藏”。
仔细体会一下。
只要有与父类相同的变量,且变量不是静态的,就会被覆盖。
方法是包括方法名和权限等限制条件完全相同才会被覆盖。
参考技术C 1.子类能继承父类所有变量和方法(private属性和方法除外)
2.如果在子类定义相同的,肯定是使用子类自身的。
(能不能覆盖,不清楚,但肯定是调用不了了。不知道用super能不能访问,但如果方法这样的话,就叫覆写了。)本回答被提问者采纳

继承链中类实例变量的初始值

【中文标题】继承链中类实例变量的初始值【英文标题】:Initial value for class instance variable in inheritance chain 【发布时间】:2020-07-22 14:03:27 【问题描述】:

我想为每个类及其继承的类保存单独的值,并希望这些值最初为[]。所以我想到了使用实例类变量,因为它们不是跨继承链共享的:

module Foo
  def self.included(base)
    base.class_eval do
      @foos = []
    end

    base.extend ClassMethods
  end

  module ClassMethods
    attr_reader :foos
  end
end

我包含在其他有子类的类中

class Bar
  include Foo
end

class Baz < Bar
end

Bar.foos        # []
Baz.foos        # nil

所以,我的问题是,在不打开子类的情况下动态地将 Baz.foos 的值设置为 [] 而不是 nil 的最佳方法是什么?

我尝试使用类变量而不是实例类变量,但是所有类将共享类变量@@foos的同一个副本

谢谢

【问题讨论】:

def foos ; @foos ||= [] ; end 也许? 谢谢,@Stefan 这行得通 简直不敢相信这么简单。请随意回答,以便我标记您的答案。 【参考方案1】:

虽然@Stefan 在 cmets 中提供的建议可能是可行的方法,但元编程仍然是可能的;一个只需要handle inheritance。

module Foo
  def self.included(base)
    base.class_eval  @foos = [] 
    class << base
      attr_reader :foos
      def inherited(other)
        Foo.included(other)
      end
    end
  end
end

class Bar
  include Foo
end

class Baz < Bar; end

Bar.foos #⇒ []
Baz.foos #⇒ []

【讨论】:

谢谢,@Aleksei,知道如何在使用ActiveSupport::Concern而不是self.included(base)....时在class_methods块中使用inherited吗? 我不知道 ActiveSupport,抱歉。 谢谢,你很有帮助

以上是关于Java中类变量可以被继承吗的主要内容,如果未能解决你的问题,请参考以下文章

Java中类的继承

java中类的加载情况

继承链中类实例变量的初始值

20165303第四周学习总结

java中类与类之间的关系讲解

extends 继承