06java面向对象

在这里插入图片描述

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(类名调用)
	}
}

姓名不能静态 因为姓名大家都不同

静态的特点

  1. 随着类的加载而加载(person进内存 静态已经存在 country开辟好了空间 也就是说 静态会随着类的消失而消失 说明它生命周期最长)
  2. 优先于对象存在(静态是先存在 的 类后存在)
  3. 被所有对象所共享
  4. 可以直接被类名所调用

实例变量和类变量的区别

  1. 存放位置(类变量随着类的加载存在于方法区中 实例变量随着对象的建立存在堆内存中)
  2. 生命周期 :类变量生命周期最长 随着类的消失而消失 实例变量生命周期随着对象的消失而消失

静态使用注意事项

静态修饰方法时 可以直接被内存调用
静态方法只能访问静态方法和成员

但是无法从静态方法 访问非静态变量

静态方法不可以定义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]);//
		}
	}
}

什么时候使用静态

从两方面 因为静态 修饰成员变量和成员函数 什么时候定义静态变量呢?

  1. 当对象中出现共享数据时 (姓名:zs 所有人都叫zs才是静态变量)对象中的特有数据定义成非静态存在堆内存中
  2. 定义静态函数时:当功能内部没有访问到非静态数据 (对象的特有数据 )那么该功能可以定义成静态的;
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”);

  1. 因为new用到了person.class 所以会先找到person.class文件并加载到内存中
  2. new person() 静态代码块执行(如果有的话)
  3. 堆内存开辟空间 分配内存地址
  4. 在堆内存中建立对象的特有属性并进行默认初始化 属性进行显示初始化
  5. 默认初始化 name=null ;
  6. 构造代码块初始化
  7. 构造函数初始化 name age被赋值
  8. 将内存地址付给栈内存的p变量

在这里插入图片描述

p.setname(“lisi”)

setname在栈里开辟空间 this 指向堆里的对象

堆内存里是静态方法

原创文章 159 获赞 4 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44769592/article/details/101101207