精华内容
下载资源
问答
  • Java静态属性和方法的继承问题

    千次阅读 2016-06-01 13:46:03
    Java静态属性和静态方法继承的一个总结。

    今天在看《Head First设计模式》的工厂方法时,文中提到简单工厂方法采用静态方法的不足:不能通过继承来改变创建方法的行为。平时没有注意到这一点,查了些资料和做了些实验,特此记录下来。

    Parent.java类

    public class Parent {
        public String normalStr = "Normal member of parent.";
        public static String staticStr = "Static member of parent.";
    
        public void normalMethod(){
            System.out.println("Normal method of parent.");
        }
    
        public static void staticMethod(){
            System.out.println("Static method of parent.");
        }
    }

    Child.java类

    public class Child extends Parent {
        public String normalStr = "Normal member of child.";
        public static String staticStr = "Static member of child.";
    
        public void normalMethod(){
            System.out.println("Normal method of child.");
        }
    
        public static void staticMethod(){
            System.out.println("Static method of child.");
        }
    }
    

    测试类Main.java类

    public class Main {
        public static void main(String[] args) {
            Child child = new Child();
            System.out.println(child.normalStr);
            System.out.println(Child.staticStr);
            child.normalMethod();
            Child.staticMethod();
    
            System.out.println("-------------------------------------------------");
    
            Parent child1 = new Child();
            System.out.println(child1.normalStr);
            System.out.println(Parent.staticStr);
            child1.normalMethod();
            Parent.staticMethod();
        }
    }
    

    得到的结果:

    Normal member of child.
    Static member of child.
    Normal method of child.
    Static method of child.
    -------------------------------------------------
    Normal member of parent.
    Static member of parent.
    Normal method of child.
    Static method of parent.

    结论

    对于非静态的属性和方法

    • 对于非静态属性,子类可以继承父类的非静态属性。但是当子类和父类有相同的非静态属性时,并没有重写并覆盖父类的非静态属性,只是隐藏了父类的非静态属性。
    • 对于非静态的方法,子类可以继承父类的非静态方法并可以重写覆盖父类的非静态属性方法。

    对于静态的属性和方法

    • 对于静态的属性,子类可以继承父类的静态属性。但是和非静态的属性一样,会被隐藏。
    • 对于静态的方法,子类可以继承父类的静态方法。但是子类不可重写覆盖父类的静态方法,子类的同名静态方法会隐藏父类的静态方法。
    展开全文
  • static修饰的属性和方法就是静态属性和静态方法。 普通属性 / 普通方法 都绑定着一个隐含的对象 (this),static含义就是和对象解绑, 静态属性不再保存在对象(堆区)中,而是保存在类(方法区)中。 注意:...

    static修饰的属性和方法就是静态属性和静态方法。

    普通属性 / 普通方法 都绑定着一个隐含的对象 (this),static含义就是和对象解绑,

    静态属性不再保存在对象(堆区)中,而是保存在类(方法区)中。

    注意:静态方法调用时,没有隐含着的对象,所以也就无法使用this关键字。

    一个类的所有的对象,是可以共享静态属性的。(可以适当看作C语言的全局变量)

     

    访问静态属性/调用静态方法语法:

    类名称.属性名称;

    类名称.方法名称(实参列表);

     

    public class Test{
        int a=1;//普通属性
        static int b=2;//静态属性
        public static void main(String[] args){//静态方法
        System.out.println(a);//不能访问普通属性
        System.out.println(b);//可以访问静态属性
        }
    

    静态方法不能直接访问普通属性,可以创建对象访问.而普通方法可以直接访问静态属性和普通属性。

    public class Test{
        int a=1;//普通属性
        static int b=2;//静态属性
        public static void main(String[] args){//静态方法
        Test p = new Test();
        System.out.println(p.a);
        System.out.println(b);
        }
    

    静态属性和非静态属性的区别:

    1、静态属性静态方法都存放在内存中的方法区  而普通属性存放在内存中的堆区

    2、静态属性或方法在没创建对象之前就已经存在 而非静态属性在创建对象之后才存在

    3、一个类的所有的对象,是可以共享静态属性的。

    4、 静态属性在类消失之后才销毁  而非晶态属性在对象销毁之后才销毁的

    5、静态属性可以通过类名直接访问  非静态属性不能通过类直接访问只能通过对象访问

     

    属性的初始化(发生在生命周期的第二阶段,对象实例化的时候)

    1)定义时初始化   int a=10;
    2)构造代码块
    {
        a=10;
    }
    3)构造方法中初始化
     Person(){
        a=10;
    }
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    1)和2)先执行 ,3)最后执行

    构造方法初始化写在前也最后执行

     

    静态属性的初始化

    1)static int a=10;      1)和2)按照定义顺序依次执行
    2)静态构造代码块
    static{
        a=20;
    }

    先初始化静态属性再普通属性。

    由以下代码验证:

    public class A {
    	A() {
    		System.out.println("构造方法中,a = 30");
    		a = 30;
    	}
    	
    	{ System.out.println("构造代码块 1时,a = 0"); a = 0; }
    	int a = init();
    	{ System.out.println("构造代码块 2时,a = 20"); a = 20; }
    	
    	
    	int init() {
    		System.out.println("定义时  a = 10");
    		return 10;
    	}
    	
    	static {
    		System.out.println("静态代码块 1时,staticA = 100");
    		staticA = 100;
    	}
    	static int staticA = staticInit();
    	static {
    		System.out.println("静态代码块 2时,staticA = 300");
    		staticA = 300;
    	}
    	
    	static int staticInit() {
    		System.out.println("静态定义时  staticA = 200");
    		return 200;
    	}
    	
    	
    	public static void main(String[] args) {
    		A p = new A();
    		A q = new A();
    	}
    }

     

     

     

     

     

    展开全文
  • 结论:java静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 原因: 1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了...

    开始正文之前的一个参考:



    原文链接:点击打开链接


    结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.

    原因:
    1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。
    2). 多态之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键)。有了继承和重写就可以实现父类的引用指向不同子类的对象。重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。

    3). 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。非静态方法可以被继承和重写,因此可以实现多态。


    例子:

    package com.study.test;
    
    public class A { //父类
    	public static String staticStr = "A静态属性";
    	public String nonStaticStr = "A非静态属性";
    	public static void staticMethod(){
    		System.out.println("A静态方法");
    	}
    	public void nonStaticMethod(){
    		System.out.println("A非静态方法");
    	}
    }

    package com.study.test;
    
    public class B extends A{//子类B
    	public static String staticStr = "B改写后的静态属性";
    	public String nonStaticStr = "B改写后的非静态属性";
    	public static void staticMethod(){
    		System.out.println("B改写后的静态方法");
    	}
    }

    package com.study.test;
    
    public class C extends A{//子类C继承A中的所有属性和方法
    
    }

    package com.study.test;
    
    public class StaticExtendsTest {
    
    	public static void main(String[] args) {
    		C c = new C();
    		System.out.println(c.nonStaticStr);
    		System.out.println(c.staticStr);
    		c.staticMethod();//输出的结果都是父类中的非静态属性、静态属性和静态方法,推出静态属性和静态方法可以被继承
    		
    		System.out.println("-------------------------------");
    		
    		A c1 = new C();
    		System.out.println(c1.nonStaticStr);
    		System.out.println(c1.staticStr);
    		c1.staticMethod();//结果同上,输出的结果都是父类中的非静态属性、静态属性和静态方法,推出静态属性和静态方法可以被继承
    	
    		System.out.println("-------------------------------");
    		B b = new B();
    		System.out.println(b.nonStaticStr);
    		System.out.println(b.staticStr);
    		b.staticMethod();
    		
    		System.out.println("-------------------------------");
    		A b1 = new B();
    		System.out.println(b1.nonStaticStr);
    		System.out.println(b1.staticStr);
    		b1.staticMethod();//结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态
    	}
    
    }



    展开全文
  • Java静态方法和静态属性

    千次阅读 2018-08-14 16:10:16
    3、被static修饰的方法中,只能调用静态方法或静态属性,不能调用非静态方法和非静态属性 被static修饰的属性称为静态属性,也称为类属性,这个属性是从属类的,而不是对象的 被static修饰的方法称为静态方法,也...

    被static修饰的属性和方法的特点
    1、先于对象存在
    2、在类内存中永远只有一份
    3、被static修饰的方法中,只能调用静态方法或静态属性,不能调用非静态方法和非静态属性
    被static修饰的属性称为静态属性,也称为类属性,这个属性是从属类的,而不是对象的
    被static修饰的方法称为静态方法,也称为类方法
    被static修饰的属性和方法直接通过类调用

    刚才写一个用户注册、登陆的类,因为要用DB类储存数据,所以建了一个ArrayList,刚开始没用Static,程序运行注册完之后,在登录的时候get不到ArrayList中存储的数据,调试了很久,各种方法都用过,心态爆炸,最后用Static修饰ArrayList之后就ok了。因为被Static修饰,在类的内存中只有一份,会get到注册传过去的账号和密码。

    展开全文
  • 一、什么是静态属性和非静态属性静态属性是指被static修饰符修饰的类、方法、变量或代码块等。 非静态属性是指没有被static修饰的。 二、静态属性和非静态属性的特点是什么? 静态属性特点: 1. 一声明就被...
  • java静态方法,静态属性

    千次阅读 2017-01-27 13:04:25
    静态方法,静态属性,都是不需要创建实例对象就可以调用,而且是单例的,不管创建多少个对象,都是共享一个 静态属性。 静态方法不可以调用非静态的变量,只可以调用静态的属性。 静态方法不可以调用非静态的方法...
  • Java static 静态属性和方法1、静态属性和方法从属于类,不从属与对象2、不能在静态方法中调用非静态变量和非静态方法3、可以在普通方法中调用静态属性和方法我们以下面的这个简单的Student类为例public class ...
  • Java静态代码块和静态属性加载顺序

    千次阅读 2019-04-11 17:37:26
    Java静态代码块、静态属性、构造函数加载顺序 代码实例 //父类 public class B { public static B t1 = new B(); public static B t2 = new B(); public B(){ super(); System.out.println("B类构造块"); } ...
  • public static String str = "Father类中的静态属性"; public String s = "Father中的非静态属性"; public static void fun(){ System.out.println("Father类中的静态方法"); } public void f(){ System....
  • 首先,经过本人的测试,freemarker只能调用JAVA的Public static 方法及属性。 背景说明:框架使用的是spring+springmvc+freemarker package com.zxsd.test.util; import java.u
  • java静态属性与非静态属性

    千次阅读 2011-09-16 17:15:18
    Student 类 public class Student {  public static String sex = null;  private String name = null;...2.非静态属性只能属于某个对象,其它的对象不能访问它的属性。随着对象的消亡而消亡。
  •    public class Test { ...//由static修饰,静态属性   int classNum;     public static void main(String[] args) {    Test person = new Test();  //在这个对象
  • 换句话说,对于该类的任何一个具体对象而言,静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值,同样任何一个类的对象去修改它时,也都是在对同一个内存单元做操作。  静态属性节省
  • JAVA的类属性,静态属性

    千次阅读 2019-04-02 20:16:35
    当一个属性被static修饰的时候,就叫做类属性,又叫做静态属性 当一个属性被声明成类属性,那么所有的对象,都共享一个值 与对象属性对比: 不同对象的 对象属性 的值都可能不一样。 比如盖伦的hp 和 提莫的hp 是不...
  • //是由静态属性 在同一个类中可以通过对象名调用的原因是应为,私有成员在类中可以用同类成员调用 //总而言之静态方法只能使用静态属性和静态方法 //而同一类中非静态方法可以调用静态方法和静态...
  • 反射获取静态属性

    千次阅读 2017-10-22 11:19:31
    通过反射获取java静态属性
  • 一、静态方法在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如: 一般情况下,工具类里面的方法都会定义为静态方法,例如...
  •  今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域、静态块、非静态域、非静态块、构造函数的执行顺序问题。其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度。很多...
  • java类的静态属性和静态块执行条件如下所示: 1.如果java类在项目启动的时候,就创建了实例(例如new Person())或者此类的对象交给spring框架管理(依赖注入ioc),那么项目启动的时候就执行这个Java类的所有...
  •  System.out.println("静态变量x="+StaticDemo.getX());  StaticDemo a= new StaticDemo(); StaticDemo b= new StaticDemo();  a.setX(1);  a.setY(2);  b.setX(3);  b.setY(4);  System.out.println("静态...
  • Java接口类只能声明静态属性

    千次阅读 2015-09-15 10:19:04
    Java的接口在声明属性时会发现一个很奇怪的现象, 可能大家在很多地方都会看到这样的描述: 接口类中的只能有静态属性, 但是在实际写代码中你会发现, 可以在接口中声明一个不是静态属性, 并且不会报错, 如下: ...
  • 静态属性的赋值--》大于静态代码块--》普通属性赋值--》大于普通代码块。
  • JAVA面向对象之静态属性和方法

    千次阅读 2015-12-23 22:10:50
    在实际软件开发过程中,有的时候希望无论是否产生了对象,或是产生了多少对象,某些特定的数据在内存中只有一份,JAVA中通过static关键字来解决这个问题。 在类内使用关键字static修饰的成员变量和成员方法分别称为...
  • java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果。 理论知识: 静态代码块是:属于类的,在类加载时就自动执行。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 450,914
精华内容 180,365
关键字:

java静态属性

java 订阅