class person
{
String name;
static String country="cn";
person(int age)
{
this.age=age;//一初始化就有一个age
}
public static void show(){
System.out.println(name+"+"+country);
}
//用于比较年龄是否相同的功能 看是否是同龄人 传一个对象就行 因为自己本身是一个对象
public boolean compare(person p)
{
if(this.age==p.name)
{
return true;
}
}
}
class satticdemo {
public static void main(String[] args)
{
person p1=new person();
p.name="zhang";
p.show();
System.out.printfln(p.country);//cn
}
}
当每个对象都是用
new
堆内存产生一个对象
没必要每个对象都占用一个 国籍变量
static 关键字
是个修饰符修饰成员(变量 函数)
加了以后可以访问 但是节省堆内存空间 除了可以被对象调用 还可以直接被类名调用 类名 静态成员
class person
{
String name;
static String country="cn";
person(int age)
{
this.age=age;//一初始化就有一个age
}
public static void show(){
System.out.println(name+"+"+country);
}
//用于比较年龄是否相同的功能 看是否是同龄人 传一个对象就行 因为自己本身是一个对象
public boolean compare(person p)
{
if(this.age==p.name)
{
return true;
}
}
}
class satticdemo {
public static void main(String[] args)
{
person p1=new person();
p.name="zhang";
p.show();
System.out.printfln(person.country);//cn(类名调用)
}
}
姓名不能静态 因为姓名大家都不同
静态的特点
- 随着类的加载而加载(person进内存 静态已经存在 country开辟好了空间 也就是说 静态会随着类的消失而消失 说明它生命周期最长)
- 优先于对象存在(静态是先存在 的 类后存在)
- 被所有对象所共享
- 可以直接被类名所调用
实例变量和类变量的区别
- 存放位置(类变量随着类的加载存在于方法区中 实例变量随着对象的建立存在堆内存中)
- 生命周期 :类变量生命周期最长 随着类的消失而消失 实例变量生命周期随着对象的消失而消失
静态使用注意事项
静态修饰方法时 可以直接被内存调用
静态方法只能访问静态方法和成员
但是无法从静态方法 访问非静态变量
静态方法不可以定义this super关键字 (因为静态优于对象存在 所以静态方法不可以出现this)
静态有利有弊
利:对对象的共享数据进行存储 节省内存 没有必要每个对象都存储一次 可以直接被类名调用
弊:生命周期过长。访问出现局限性(静态虽好 只能访问静态)
main
class maindemo {
public static void main(String[] args)//一般函数 虚拟机固定调用这个main函数
{
System.out.printfln("hh");//cn(类名调用)
}
public static void main(int x)//能存在 被重载
{
System.out.printfln("hh");//cn(类名调用)
}
}
主函数是一个特殊的函数 作为程序的入口可以被jvm调用
主函数的定义
public 代表该函数的访问权限最大
static 代表主函数随着类的加载 就已经存在了
void 主函数没有具体的返回值
main(不是关键字)是一个特殊的单词可以被jvm识别
函数的参数:(String[] arr)参数类型是一个数组 数组中的元素是一个字符串
主函数是固定格式的 jvm识别
class maindemo {
public static void main(String[] args)//args可以换名字 原本是arguments(参数)后来简写
{
System.out.printfln(args[0]);//
}
}
String[] arg可以让我们往里面传值
javac 启动编译器
java maindemo haha hehe heihei
class maindemo {
public static void main(String[] args)//args可以换名字 原本是arguments(参数)后来简写
{
String[] arr={"haha","xixi","heihei","hiahia"};
maintest.main(arr);
}
}
class maintest {
public static void main(String[] args)//args可以换名字 原本是arguments(参数)后来简写
{
for(int x=0;x<args.length;x++){
System.out.printfln(args[x]);//
}
}
}
什么时候使用静态
从两方面 因为静态 修饰成员变量和成员函数 什么时候定义静态变量呢?
- 当对象中出现共享数据时 (姓名:zs 所有人都叫zs才是静态变量)对象中的特有数据定义成非静态存在堆内存中
- 定义静态函数时:当功能内部没有访问到非静态数据 (对象的特有数据 )那么该功能可以定义成静态的;
class person
{
String name;
public static void show()
{
System.out.println("haha");
}
}
class {
public static void main(String[] args)
{
person p=new person();
p.show();//没有当问到name
}
}
静态的应用
应用程序会有共性的功能 可以将这些功能抽取 独立封装
以便复用
class demo{
public static void main(String[] args)
{
int[] arr={3,4,1,6};
int max=get(arr);
System.out.println(max);
}
public static int get(String[] args)
{
int max=0;
for(int x=0;x<arr.length;x++)
{
if(arr[x]>arr[max])
{max=x;}
}
return arr[max];
}
}
class person
{
public int getmax(int[] arr)
{
int max=0;
for(int x=0;x<arr.length;x++)
{
if(arr[x]>arr[max])
{max=x;}
}
return arr[max];
}
public int getmin(int[] arr)
{
int min=0;
for(int x=0;x<arr.length;x++)
{
if(arr[x]<arr[min])
{min=x;}
}
}
public void selectsort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=0;y<arr.length;y++)
{
if(arr[x]>arr[y])
{
swap(arr,x,y);
}
}
}
}
public void swap(int[] arr,int a,int b)
{
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}
class {
public static void main(String[] args)
{
person p=new person();
p.show();//没有当问到name
}
}
javac array tool.java
javac arraytooldemo.java
java arraytooldemo
javac arraytooldemo.java
只有arraytool.class 也能编译成功
javadoc
这样只能到这个文件目录 不能运行
加点后
将class文件发送给其他人 只要其他人将该文件设置到classpath文件路径下 就可以使用该工具类 我们使用的时候不知道有什么功能
于是说明书
java的说明书通过文档注释
/**
对类的描述信息
这是一个可以对数组进行操作的工具类 该类提供了获取最值 排序 的功能
@ 接收一个int类型的数组
@return返回一个最大值
*/
将文档提取:
javadoc -d myhelp -auther -version ***.java
public类才能生成文件
myhelp是自动生成的目录
私有方法不会被提取
一个类中 默认有一个空参数的构造函数
这个默认的构造函数的权限和所属类一致
如果类被public修饰 那么默认的构造函数也带public修饰符
如果类没有被public修饰 那么默认的构造函数 也没有public修饰
默认构造函数的权限会跟所属类的变化而变化
静态代码块
static
{
}
特点:随着类的加载而执行 只执行一次 并优先于主函数
用于给类初始化
class staticcode
{
static
{
System.out.println("a");
}
}
s没有任何指向
只有用到内容了 才加载这个类的静态代码块
先进行静态代码块 不能访问其他变量
第三个代码块可以访问num
对象的初始化过程
person p=new person(“zhansan”,“2”);
- 因为new用到了person.class 所以会先找到person.class文件并加载到内存中
- new person() 静态代码块执行(如果有的话)
- 堆内存开辟空间 分配内存地址
- 在堆内存中建立对象的特有属性并进行默认初始化 属性进行显示初始化
- 默认初始化 name=null ;
- 构造代码块初始化
- 构造函数初始化 name age被赋值
- 将内存地址付给栈内存的p变量
p.setname(“lisi”)
setname在栈里开辟空间 this 指向堆里的对象
堆内存里是静态方法