静态方法和静态成员

2024-08-24 09:18
文章标签 静态 成员 静态方法

本文主要是介绍静态方法和静态成员,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、静态成员
1、Why?为什么要有静态变量、静态常量、静态方法
   有时候处理问题时需要两个类在同一个内存区共享一个数据,例如PI这个常量。静态数据和静态方法的作用通常是为了提供共享数据或方法,如
数学的计算公式等。
2、在静态方法中可以调用的方法和成员变量必须是静态的。如例:

StaticAccessNonStatic.java

package Test8;

public class StaticAccessNonStatic {
//方法info()没用static修饰,不是静态的。所以它是对象相关的方法而不是类相关的方法。
public void info(){
System.out.println("调用了info()方法");
}
public static void main(String[] args) {
//这样调用是 错误 的,因为这相当于this.info();main是静态方法,而info()是非静态方法。static修饰的方法中不能使用this引用,即静态成员不能访问非静态成员。
info(); 这里是 错误 的,如果运行该代码一定把这行注释掉
//如果确实需要在静态方法中访问一个普通方法,则创建一个对象
StaticAccessNonStatic sans=new StaticAccessNonStatic();
sans.info();
}

}

这是为什么呢?

我也是Java初学者。前几天在Core Java这本书里面看到的解释是:
静态方法实际是类的方法,而不是关于对象的方法。所以不是“可以不通过对象调用方法”,而是恰恰应该使用类来调用,而且鼓励这种写法,而不
是通过对象调用。即:静态方法不和对象相关,而是仅仅和类相关。
为啥呢?解释是这样的:在一般的类中定义的方法中,非静态类其实不仅仅有他们后面括号里面的显式参数(比如 public int getField(String 
param1, int param2)这个方法,显式参数是param1和param2),还包括一个隐式参数:即这个调用方法的对象(即this)。而静态方法,则没有这
个隐式的参数,仅仅就只有括号中的显式参数。
既然是因为静态方法不和对象关联,那么它就只能用同样仅仅和类关联而不和对象关联的实例域,毕竟不是静态的实例域在不同对象中基本上都是不
同的嘛。
3、Java中规定不能将方法体内局部变量声明为static
4、静态方法中不可以使用this关键字。Why? 
static方法类方法,先于任何的实例(对象)存在。即static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的
是当前的对象
,在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中
成员变量和局部变量重名的情况
.。而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用
者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this。这也与静
态成员不能访问非静态成员一致。

二:当想访问一个方法而不是构造方法时,可以将访问的方法设为static静态方法,然后直接使用类名.方法名就可以访问;如果在同一个类中,类名都可以省略,直接写方法名即可。

Test.java

package Test1;
//一个文件里面可以有多个类,但是只能有一个声明为public标识主类,且该主类里面必须有main()主方法,
class Person {
public String name="not know";//5   
public int age=0;//6
//父类Person的无参构造方法
public Person(){
}
//父类Person的有参数构造方法
public Person(String name,int age){//4
//注意调用完super后不会立马执行方法体里面的代码,而是转而执行在类定义时进行的变量初始化
this.name=name;//7
this.age=age;//8
}
public void showInfo(){//13
System.out.println("Name is :"+name+"Age is :"+age);
}
}
class Student extends Person{
//执行完父类的类定义时变量的初始化,会执行父类构造方法的方法体;然后再执行子类的类定义时变量的初始化
public String school="not known";//9
   //子类Student的无参构造方法
public Student(){
super();
}
//子类Student的有参构造方法
public Student(String name,int age,String school){//2
//在构造函数里,首先检查是否有this或super,二者只能出现其一,并且只能作为构造函数的第一句
//在子类的构造函数中调用父类的构造函数用super,并且把参数传递给父类的构造函数

super(name,age);//3
//执行完子类的类定义时变量的初始化,再执行子类构造方法的方法体
this.school=school;//10
}
//子类的方法,用它时需要调用。调用时用(对象名.方法名)方式
public void showInfo(){
super.showInfo();//12
System.out.println("School is :"+school);//14
}
}
public class Test {
public static void main(String[] args) {
//实例化对象stu,调用类Student的有参构造方法,并传递参数给构造方法
Student stu=new Student("wanghao",21,"qinghuadaxue");//1
//使用(对象名.方法名)调用showInfo()方法
stu.showInfo();//11
}
}

这篇关于静态方法和静态成员的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102065

相关文章

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

C++/《C++为什么要有静态成员函数》

摘要        本文说明了什么是静态成员变量,什么是静态成员函数的概念,讨论了访问私有静态成员变量的三个方法。得出用静态成员函数访问静态私有成员变量是最佳方法即回答了“C++为什么要有静态成员函数“的问题。 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po

本地如何快速启动静态服务器

本地快速启动静态服务器 有许多第三方库可以帮助你快速启动一个静态服务器,甚至无需编写代码。通过命令行运行这些库后,它们会自动启动一个服务器并打开指定端口,展示当前目录下的文件内容: 电脑得提前安装NodeJS 1、http-server http-server 是一个轻量级的命令行工具,允许你快速启动一个静态文件服务器。 安装 npm install -g http-server

linux基础IO——动静态库——进程编址、进程执行、动态库加载

前言:本节内容为基础IO部分的最后一节, 主要是为了讲一下动静态库里面的动态库如何加载到内存, 动态库的地址等等。 但是,这些内容牵扯到了程序的编址, 程序的加载, 进程的执行等等知识点, 所以,我们会从程序的编址讲起, 一直到进程的执行, 以及动态库加载结束。         ps:本节内容涉及到了进程地址空间, 磁盘的内容, 建议友友们了解相关知识后再来观看。 目录

(六十四)第 10 章 内部排序(静态链表的插入排序)

示例代码 staticLinkList.h // 静态链表的插入排序实现头文件#ifndef STATIC_LINK_LIST_H#define STATIC_LINK_LIST_H#include "errorRecord.h"#define SIZE 100#define NUM 8typedef int InfoType;typedef int KeyType;ty

ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名

前言 当我们需要把本地开发的应用展示给外部用户时,常常会因为无法直接访问而陷入困境。 就为了展示一下,买服务、域名,搭环境,费钱又费事。 那有没有办法,让客户直接访问自己本机开发的应用呢? 这种需求场景这么多,当然有现成的技术 —— 内网穿透。 什么是内网穿透? 内网穿透是一种网络技术,它允许外部互联网用户访问部署在本地网络(内网)中的服务或设备。 通常,家庭或企业网络都位于内网,连

spring MVC访问静态文件,如jpg,js,css

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。   目的:可以正常访问静态文件,不要找不到静态文件报404。   方案一:激活Tomcat的defaultServlet来处理静态文件 Xml代码 <se