javaseday06(构造函数,this,static,main)
构造函数 构建创造对象时调用的函数
1、函数名与类名相同2、不用定义返回值类型3、没有具体的返回值
作用:给对象进行初始化(对象一创建就有一些特性)
创建对象都必须要通过构造函数初始化
一个类中如果没有定义过构造函数那么该类会有默认的空参构造函数
如果在类中定义了指定的构造函数那么类中的默认构造函数 就没了
一编译完就有 空参构造函数
函数关注声明: 返回值 、 函数名、 参数 (里面内容无关也不知道) 函数封装
有了空参构造函数就不帮你加无内容的空参构造函数了
对象要经过初始化(空参构造函数) 才能用
构造函数对象创建时就会调用与之对应的构造函数对对象进行除书画
一般函数在对象创建后 需要函数功能时才调用
构造函数 对象创建时会调用只调用一次
一般函数 对象创建后可以调用多次
如果p..Person(); 再次初始化 烂透了
new Person(); 可调用初始化函数
类名(){} 构造函数 而且是空参数
描述事物时该事物一存在就具备的一些内容 这些内容都定义在构造函数中
如果有的孩子一出生就有名字就
Person(String n){ //对对象进行赋值
name=n;
}
重载和参数个数和参数类型和参数类型的顺序
没调用构造函数(构造函数初始化) 对象就没创建成功
setName 必须要写 不然不能修改
构造函数内能加一般函数 一般函数也能调用构造函数不过要new一个 没啥用
构造函数跟类名走 首字母要大写 一般函数要小写也能用void 类名 不够会有阅读性问题
自己定义 了有参构造函数就不会帮你创建无参构造函数 要自己再创
构造函数内有return ; return 为了结束函数
this 代表当前对象的
this就是所在函数所属对象的引用
哪个对象调用this所在的函数this就代表了哪个对象
成员变量和局部变量重名可用this区分
一般函数里都省略了this this 为了找到具体的对象
一个类当中所有的成员想被执行就要有对象调用
this(name); 可以让name 的构造函数进栈 (调用构造函数)
在构造函数中调用其他构造函数 一般函数调用不了 只能定义在构造函数的第一行 因为初始化动作要先执行
2个构造函数 互相调用会导致栈内存溢出 程序停
调用本类对象用this
static 关键字和修饰符
static 修饰的是被共享的数据 可以被对象使用 直接用类名访问
有些数据共享 有些数据特有的
static特点 1、是一个修饰符 用于修饰成员 2、static修饰的成员被所有的对象所共享 3、static优先于对象存在 因为static的成员随着类的的加载就已经存在 4、static修饰的成员多了一种调用方式 可以直接被类名所调用 类名.静态成员 5、静态修饰的数据是共享数据 对象中的存储是特有数据
static 修饰后叫做静态变量(类变量)不能叫做成员变量 成员变量还可以叫做实例变量
成员变量和静态变量的区别
1、两个变量的生命周期不同
成员变量随着对象的创建而存在 随着对象的被回收而释放,静态变量随着类的加载而存在 随着类的消失而消失(虚拟机结束 类消失 类本身也是个对象)(生命周期太长但节约了空间)
2、调用方式不同
成员变量只能被对象调用 静态变量可以被对象调用,还可以被类名调用 建议用类名调用 不用对象调用 比较直观 阅读性好
3、别名不同
成员变量也称为实例变量 静态变量称为类变量
4、数据存储位置不同
成员变量数据存储在堆内存的对象中 所以也叫做对象的特有数据 静态变量数据存储在方法区(共享数据区)的静态区 所以也叫做对象的共享数据
静态使用的注意事项:
1、静态方法只能访问静态成员(静态优先加载 没对象 成员变量还不存在)(非静态既可以访问静态,又可以访问非静态) 2、静态方法中不可以使用this 或者super 关键字 3、主函数是静态的
new StaticDemo().show(); (可以不用都加静态 即可调用)
静态成员前面省略的是类名 成员变量的是this
主函数(入口)用来 创建其他类的对象 调用那些类的方法 代码封装在函数 函数封装在类中
主函数的特殊之处:
1、格式是固定的 2、被jvm所识别和调用
public :因为权限必须是最大的 static:虚拟机在调用不需要对象直接用主函数所属类名调用即可 void:主函数没有具体的返回值(返回给指挥者 虚拟机没啥用)
main:函数名不是关键字 只是jvm识别的固定的名字 String[] args :这是主函数的参数列表 是一个数组类型的参数而且元素都是字符串类型(创建了一个字符串类型的数组实体)
虚拟机给主函数传递了一个长度为0的数组实体
cmd 中 java 类名 haha hehe xixi syso("args[0]") 打印haha 这时虚拟机给主函数传递的是长度为3的数组
public static void main(int x){} 不是入口 只认那个固定的 只有args可以改
有返回值必须要有return
静态什么时候用
1、静态变量 当分析对象中所具备的成员变量的值都是相同的 这时这个成员就可以被静态修饰 只要数据在对象中都是不同的那就是对象的特有数据必须存储在堆中中是非静态的如果是相同的数据 对象不需要做修改只需要使用即可不需要存储在对象中定义成静态
2、静态函数 函数是否用静态修饰 就参考一点就是该函数功能是否有访问到对象中的特有数据 简单来说 从源代码看该功能是否需要访问非静态的成员变量,如果需要就是非静态的如果不需要就可以定义成静态的 当然也可以定义成非静态 但非静态需要对对象调用, 而仅创建对象调用非静态的没有访问特有数据的方法 该对象的创建没有意义
特有数据指的是数据值
对象是为了封装特有数据 如果方法没有访问特有数据 创建对象是浪费空间 用静态修饰
静态要求没对象也能执行
class StaticCode
{
static //静态代码块 没加东西就是代码块
{
}
}
静态代码块 随着类的加载而执行而且只执行一次
作用:用于给类进行初始化 有些类都是静态的不需要对象
构造函数是对对应对象进行初始化(进行针对性的初始化)
类中独立代码块 构造代码块 构造对象的代码块 创建对象几次就调用几次 可以给所有对象进行初始化 具有初始化的通用性
函数中的
{
}局部代码块 限定变量的生命周期
寄存器 cpu 使用的内存区