静态属性和非静态属性的赋值与取值
- 格式:doc
- 大小:56.00 KB
- 文档页数:10
OGNL(取值、赋值、调⽤普通⽅法、静态⽅法、创建对象)1、OGNL表达式(1)概念OGNL:对象导航图语⾔(Object Graph Navigation Language),是⼀种表达式语⾔,功能⽐EL表达式更为强⼤,它是集成在Struts中的。
在创建Struts项⽬的时候已经将OGNL有关的包导⼊了,所以,这⾥不需要重复导包。
(2)OGNLContext对象:EL表达式从是⼀个内置对象中取值,⽽OGNL表达式只从OGNLContext对象中取值,该对象可以分为两部分,其中root部分可以存放任何对象,Context部分只能存放键值对。
2、OGNL初始化和取值public class OgnlTest {public void test() throws OgnlException {User rootuser=new User("zhai","123",12);//root部分Map<String,User> context=new HashMap<String, User>();//context部分context.put("user1",new User("user1","111",12));context.put("user2",new User("user2","222",13));OgnlContext ognlContext=new OgnlContext();//创建OGNLContext对象ognlContext.setRoot(rootuser);ognlContext.setValues(context);//将root和context部分放⼊到OGNLContext内部String name= (String)Ognl.getValue("username",ognlContext,ognlContext.getRoot());//取值Integer age=(Integer)Ognl.getValue("userage",ognlContext,ognlContext.getRoot());String password=(String)Ognl.getValue("password",ognlContext,ognlContext.getRoot());System.out.println("⽤户名:"+name+",年龄"+age+",密码:"+password);String name1= (String)Ognl.getValue("#ername",ognlContext,ognlContext.getRoot());Integer age1=(Integer)Ognl.getValue("#erage",ognlContext,ognlContext.getRoot());System.out.println("⽤户名:"+name1+",年龄"+age1);}(1)在初始化部分,需要先对root和context分别做初始化操作,然后将root和context放⼊到OGNLContext对象内部,这样初始化⼯作就完成了。
java静态⽅法与⾮静态⽅法的区别
●⽣命周期(Lifecycle):
静态⽅法(Static Method)与静态成员变量⼀样,属于类本⾝,在类装载的时候被装载到内存(Memory),不⾃动进⾏销毁,会⼀直存在于内存中,直到JVM关闭。
⾮静态⽅法(Non-Static Method)⼜叫实例化⽅法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引⽤。
不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。
●在内存中存储位置
静态⽅法和静态变量创建后始终使⽤同⼀块内存,是连续的。
⾮静态⽅法会存在于内存的多个地⽅,是离散的。
●效率
静态⽅法的使⽤效率⽐⾮静态⽅法的效率⾼。
●线程安全
静态⽅法是共享代码段,静态变量是共享数据段。
既然是“共享”就有并发(Concurrence)的问题。
⾮静态⽅法是针对确定的⼀个对象的,所以不会存在线程安全的问题。
●使⽤范围
静态⽅法:⒈有静态属性的类,⼀般会定义静态⽅法。
⒉没有属性的类,⼀般会定义静态⽅法。
⒊如果⼀个⽅法与他所在类的实例对象⽆关,那么它就应该是静态的。
静态⽅法可以被继承但是不能被覆盖。
●总计
如果静态⽅法在系统中定义太多,会占⽤⼤量的资源,最后造成内存溢出,所以静态⽅法不能滥⽤。
如果从线程安全、性能、兼容性上来看,选⽤实例化⽅法为宜。
C#中静态⽅法与⾮静态⽅法(static),公有与私有(public,private)梳理公有与私有,静态与⾮静态的应⽤1)公有与私有public(公有的):声明的⽅法和属性,可以被外部调⽤.private(私有的):声明的⽅法和属性,只能在本类中被调⽤,外部看不到.2)静态与⾮静态static(静态的):声明的⽅法和属性,不需要实例化就能被调⽤(公有/私有).C#静态⽅法与⾮静态⽅法⽐较⼀、C#静态成员:1、静态成员属于类所有,⾮静态成员属于类的实例所有。
2、每创建⼀个类的实例,都会在内存中为⾮静态成员新分配⼀块存储;⼆、C#静态⽅法1、C#静态⽅法属于类所有,类实例化前即可使⽤。
2、⾮静态⽅法可以访问类中的任何成员,静态⽅法只能访问类中的静态成员。
3、因为静态⽅法在类实例化前就可以使⽤,⽽类中的⾮静态变量必须在实例化之后才能分配内存,C#静态⽅法调⽤时⽆法判断⾮静态变量使⽤的内存地址。
所以⽆法使⽤。
⽽静态变量的地址对类来说是固定的,故可以使⽤。
三、C#静态⽅法是⼀种特殊的成员⽅法它不属于类的某⼀个具体的实例,⽽是属于类本⾝。
所以对静态⽅法不需要⾸先创建⼀个类的实例,⽽是采⽤类名.静态⽅法的格式。
1.static⽅法是类中的⼀个成员⽅法,属于整个类,即不⽤创建任何对象也可以直接调⽤!static内部只能出现static变量和其他static⽅法!⽽且static⽅法中还不能使⽤this…等关键字…因为它是属于整个类!2.静态⽅法效率上要⽐实例化⾼,静态⽅法的缺点是不⾃动进⾏销毁,⽽实例化的则可以做销毁。
3.静态⽅法和静态变量创建后始终使⽤同⼀块内存,⽽使⽤实例的⽅式会创建多个内存.4.C#中的⽅法有两种:实例⽅法,静态⽅法.静态⽅法销毁:主进程销毁时,内存中分配的静态⽅法销毁.四、获取类的名称C#静态⽅法中获取类的名称静态⽅法中⽤:string className = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;⾮静态⽅法中还可以⽤:string className = this.GetType().FullName;。
静态方法与非静态方法的区别静态方法和非静态方法是面向对象编程中的重要概念,两者都是定义在类中的函数,但是它们之间存在着一些关键的区别。
1. 定义和调用方式静态方法(static method)是类中的一个特殊方法,它使用静态修饰符(static)声明。
静态方法不依赖于类的任何实例,可以直接通过类名来调用,而无需创建类的实例对象。
例如,对于类A中的静态方法来说,调用方式为:A.method()。
非静态方法(non-static method),也称为实例方法(instance method),则是对象的方法,它依赖于对象的实例,必须通过创建类的实例对象来调用。
例如,对于类A中的非静态方法来说,调用方式为:A a = new A(); a.method()。
2. 访问权限静态方法可以访问类中的静态成员(包括静态变量和静态方法),并且可以在其他类中通过类名直接调用,不受访问修饰符的限制。
而非静态方法可以访问类中的所有成员(包括静态成员和非静态成员),包括私有成员,但它受到访问修饰符的限制。
3. 内存分配静态方法的内存分配在类加载时完成,它属于类级别的,只有一份拷贝存在于内存中。
非静态方法属于对象级别的,每创建一个对象时都会在堆内存中为其分配一份拷贝。
因此,无论创建多少个对象,静态方法只有一份拷贝,而每个对象都会有自己的非静态方法。
4. 执行时机静态方法在类加载时就已经存在于内存中,可以通过类名直接调用,无需创建类的实例对象。
而非静态方法则需要在对象创建后调用,通过实例对象.方法名()的方式调用。
5. 关于this和super关键字的使用this关键字用于引用当前对象,可以在非静态方法中使用,表示对当前对象的引用。
而静态方法不属于任何对象,无法使用this关键字。
super关键字用于在子类中调用父类的成员,也只能在非静态方法中使用。
因为静态方法不依赖于对象,而是属于类,不存在继承关系。
6. 使用场景静态方法通常用于定义工具方法,如数学计算、日期处理、字符串处理等,因为它们不依赖于对象的状态,只关注方法的输入和输出,通过类名直接调用更加方便。
C语言中的static关键字和数组是编程中常用的概念,而将它们结合起来进行赋值操作更是程序员经常会遇到的需求。
本文将从静态数组的定义和使用、静态关键字的作用、以及静态数组的赋值方式等方面进行分析和总结,希望能够为读者提供一些有益的知识。
一、静态数组的定义和使用静态数组是C语言中的一种数据类型,它是由相同类型的元素组成的集合。
静态数组在定义时需要指定数组的大小,例如:```cint arr[5];```上述代码定义了一个包含5个整型元素的静态数组。
静态数组的大小在定义时就已经确定,不能够在程序运行过程中进行动态调整。
静态数组的元素通过索引来进行访问,索引从0开始,例如:```cint value = arr[2];```上述代码就是访问arr数组中第3个元素的值,并将其赋给value变量。
二、静态关键字的作用在C语言中,static关键字有两个不同的作用,一个是用于修饰变量,另一个是用于修饰函数。
在这里我们主要讨论static修饰静态数组时的作用。
当static修饰一个全局数组时,它表示该数组在整个程序运行过程中只有一份内存空间,即使在不同的文件中引用该数组,也都指向同一块内存空间。
这意味着该数组的值在多处都是共享的,这在一些特定的场景下可能会带来一些问题。
而static修饰一个局部数组时,则表示该数组在程序执行时只会初始化一次,即使函数多次被调用,该数组的值也会保持不变。
三、静态数组的赋值方式在C语言中,静态数组的赋值有多种方式,下面将分别介绍这些方式及其使用场景。
1. 手动逐个赋值手动逐个赋值是最基本的数组赋值方式,即通过循环遍历数组,并逐个赋值。
例如:```cint arr[5];for (int i = 0; i < 5; i++) {arr[i] = i;}```这种方式的优点是灵活,适用于任何数组元素需要单独计算的场景。
但缺点是效率较低,尤其是对于较大的数组来说,循环遍历的开销较大。
ObjectC学习笔记10-静态⽅法和静态属性 在.NET中我们静态使⽤的关键字static有着举⾜轻重的作⽤,static ⽅法可以不⽤实例化类实例就可以直接调⽤,static 属性也是如此。
在Object C中也存在static关键字,今天的学习过程使⽤到了这个关键字,在这⾥记录⼀下static的使⽤。
在Object C的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作⽤域只能是在声明的这个.m⽂件中。
不过可以调⽤这个类的⽅法间接的修改这个静态变量的值。
对于Object C中的类使⽤和定义在前⾯已经做过相应的记录,可以查看。
1. 静态属性 Object C中静态属性的定义和.NET中的有点不⼀样,先看看如下代码:#import <Foundation/Foundation.h>@interface Person : NSObject{int age;NSString *name;static int totalCount;}@property int age;@property NSString *name;-(void) write;+(void) hello;@end错误的static属性定义 以上代码定义 static int totalCount; 这样在编译器中编译会报错,这样的代码编写对于编译器是不认可的。
正确的定义放⼊如下:#import <Foundation/Foundation.h>@interface Person : NSObject{int age;NSString *name;}@property int age;@property NSString *name;-(void) write;+(void) hello;@end正确的static属性定义-interface#import "Person.h"static int count;@implementation Person@synthesize age;@synthesize name;-(void) write{NSLog(@"姓名:%@ 年龄:%i",name,age);}+(void) hello{count++;NSLog(@"static = %i",count);}@end正确的static属性定义-implementation static 属性应该定义在implementation中,⽽且写在implementation之外或者⽅法之中。
非静态方法调用静态变量非静态方法调用静态变量是可能的,但在理解这个问题之前,我们需要先了解什么是静态方法和静态变量。
静态方法是属于类的一部分,可以在不实例化类的情况下调用。
静态方法是直接通过类名称来调用,而不是通过实例对象来调用的。
因为静态方法不依赖于任何实例对象,所以它不能直接访问实例变量和实例方法。
所以通常情况下,静态方法内部只能访问静态变量和静态方法。
静态变量在类的所有实例对象之间是共享的,无论创建多少个实例对象,静态变量只会在内存中创建一份。
静态变量使用static关键字来修饰,可以在类的任何地方进行访问。
静态变量可以在类的构造函数外部初始化,也可以通过类名称直接访问和修改。
现在我们来考虑一下非静态方法如何调用静态变量。
首先要明确的是,非静态方法是依赖于实例对象的方法,它需要通过实例对象来调用。
因为非静态方法依赖于实例对象,所以它可以直接访问和修改实例变量和实例方法。
当非静态方法调用静态变量时,可以通过类名称来访问静态变量,也可以通过实例对象来访问静态变量。
示例代码如下:javapublic class MyClass {public static int staticVariable = 10;public int instanceVariable = 20;public static void staticMethod() {静态方法可以直接访问静态变量System.out.println(staticVariable);静态方法不能直接访问实例变量和实例方法System.out.println(instanceVariable);instanceMethod();静态方法可以通过实例对象来访问实例变量和实例方法MyClass myObject = new MyClass();System.out.println(myObject.instanceVariable);myObject.instanceMethod();}public void instanceMethod() {非静态方法可以直接访问静态变量System.out.println(staticVariable);非静态方法可以直接访问实例变量和实例方法System.out.println(instanceVariable);instanceMethod();}}从上面的代码可以看出,在静态方法中直接通过类名称访问静态变量是可以的。
属性的基本操作方法属性是指事物具备的特征、性质或特点,可以用来描述事物的状态、特征、性质等。
在编程中,属性是类或对象的特征和行为的集合,用来描述类或对象的状态和行为特性。
下面将介绍属性的基本操作方法。
1. 定义属性:属性可以通过类或对象进行定义。
在类中定义属性时,需要在类的成员变量中声明相应的属性。
在对象中定义属性时,可以通过给对象动态添加属性来定义。
2. 访问属性:访问属性是指获取属性的值。
在类中访问属性时,可以使用对象.属性名的形式来获取属性的值。
在对象中访问属性时,可以使用对象名.属性名的形式来获取属性的值。
3. 修改属性:修改属性是指改变属性的值。
在类中修改属性时,可以通过对象.属性名赋值的形式来改变属性的值。
在对象中修改属性时,同样可以通过对象名.属性名赋值的形式来改变属性的值。
4. 删除属性:删除属性是指删除属性的定义和对应的值。
在类中删除属性时,可以通过删除属性的声明来实现。
在对象中删除属性时,可以使用del对象名.属性名的形式来删除属性。
5. 检查属性是否存在:检查属性是否存在是指判断一个类或对象是否具有某个属性。
可以通过使用hasattr()函数来实现。
hasattr(对象或类, 属性名)函数返回一个布尔值,表示该类或对象是否具有该属性。
6. 获取属性的列表:获取属性的列表是指获取一个类或对象的所有属性的列表。
可以使用dir()函数来获取类或对象的属性列表。
dir(对象或类)函数返回一个包含类或对象所有属性的列表。
7. 动态添加属性:动态添加属性是指向对象添加新的属性。
可以使用对象.属性名=属性值的形式来动态添加属性。
8. 动态删除属性:动态删除属性是指删除对象的某个属性。
可以使用del对象名.属性名的形式来删除属性。
9. 属性的访问控制:属性的访问控制是指限制对属性的访问权限。
可以使用私有属性和公有属性来实现属性的访问控制。
私有属性只能在类的内部访问,不能在外部直接访问。
公有属性可以在类的内部和外部都可以访问。
反射调用静态方法和非静态方法静态方法是指在类中声明的方法,使用static关键字修饰,可以直接通过类名来调用。
反射调用静态方法的步骤如下:1. 获取类的Class对象。
在使用反射调用静态方法之前,需要先获取类的Class对象。
可以使用Class.forName()方法或者类的.class属性来获取。
例如:Class<?> clazz = Class.forName("com.example.TestClass");或者。
Class<?> clazz = TestClass.class;2. 获取方法对象。
获取方法对象可以使用Class类中的getMethod()方法或者getDeclaredMethod()方法。
getMethod()方法只能获取公共方法,而getDeclaredMethod()方法可以获取所有方法,包括私有方法。
例如:Method method = clazz.getMethod("staticMethod", String.class);或者。
Method method = clazz.getDeclaredMethod("staticMethod", String.class);3. 调用方法。
调用方法可以使用Method类中的invoke()方法。
由于静态方法不需要对象实例,因此可以将第一个参数设置为null。
例如:method.invoke(null, "hello");完整代码如下:public class TestClass {。
public static void staticMethod(String str) {。
System.out.println("静态方法输出," + str);}。
}。
public class Main {。
public static void main(String[] args) throws Exception {。
局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。