对象:(也可以说是为了产生实例)是类的实例,其实也个封装,封装了数据,调用功能时,没有用到对象中的数据,此时构造对象的意义不大(创建对象调用这样的方法会在堆中造成空间的浪费)
static :静态修饰符——修饰方法(类中的),在这个方法中没有调用对象中的数据。 静态修饰对象可以调用,类名可以直接调用
谁调用了成员变量谁就是非静态的
静态方法:
1.静态方法不可以访问非静态变量
静态变量中不能出现stastic super 等关键字
2.非静态方法可以访问静态方法
3静态是随着类的加载而加载
4静态优先于对象存在,可以被类名直接调用
5.静态先于存在所以无法访问对象中的数据,所以静态中无法书写this 等。因为对象可能不存在
方法调用:
1.静态调用:直接写方法名或者用类名(都为静态)
package Object;
public class StasticDemo {
public static void main(String[] args){
show();
System.out.println("hello !");
}
public static void show(){
System.out.println("too");
}
}
show();
System.out.println("hello !");
}
public static void show(){
System.out.println("too");
}
}
2.对象调用:创建对象(可以在静态中调用非静态)
package Object;
public class StasticDemo {
public static void main(String[] args){
new StasticDemo().show();
System.out.println("hello !");
}
void show(){
System.out.println("too");
}
}
new StasticDemo().show();
System.out.println("hello !");
}
void show(){
System.out.println("too");
}
}
主函数就是一个静态的 函数
不管是静态方法还是非静态方法,都需要调用后执行,其执行的次序和在类里声明的次序无关,区别是静态方法是“class.method"方式执行,非静态方法是"object.method"方式执行,即后者需要创建一个对象。
不管是静态方法还是非静态方法,都需要调用后执行,其执行的次序和在类里声明的次序无关,区别是静态方法是“class.method"方式执行,非静态方法是"object.method"方式执行,即后者需要创建一个对象。
主函数
主函数:当程序编译时Java虚拟机启动,编译.class 文件,在编译文件时会找在类中是否有还有其他的程序入口(一个程序的入口只有一个--主方法)
public static void main(String[] args)
public :权限最大
static :主函数定义为静态,不需要对象,直接用类名调用。在虚拟机中直接用类名调用main()方法,运行到主函数中
void :没有返回值
main :函数名,固定
(String[] args):函数的参数列表一个字符串数组
args :arguments :参数。是一个变量名,可以改变
static:修饰成员变量,将变量变成共享的
class Circle
{
private double radius;
private static double Pi=3.14;
Circle (double radius){
this.radius=radius;
}
double getArea(){
return radius*radius*Pi;//Circle.Pi
}
}
public class Demo{
public static void main(String[] args){
Circle c=new Circle(2.00);
double area=c.getArea();
System.out.println(area);
}
}
private static double Pi=3.14;
Circle (double radius){
this.radius=radius;
}
double getArea(){
return radius*radius*Pi;//Circle.Pi
}
}
public class Demo{
public static void main(String[] args){
Circle c=new Circle(2.00);
double area=c.getArea();
System.out.println(area);
}
}
//static 修饰成员变量,将变量变成共享变量
总结:******
1.static :修饰类中的成员变量和成员行为
修饰方法:方法中不调用对象的成员变量(类中的数据)
修饰成员变量:将变量共享,在其他对象中也有可能会用到(变量的值一样),(例如 圆周率等)在每一个对象中的值 都是一样的。
2.调用:在一个类里调用静态,直接用名字(省略了类.名字)
不是在一个类中,静态(变量,方法)用类名调用
静态变量和成员变量
1.所属范围不同:静态变量属于类,成员变量属于对象
2.调用不同:静态变量能被对象和类名调用(一般是类名调用,不创建对象不浪费空间)
成员变量:只能被对象调用
3.加载不同:静态变量:随着类的加载而加载
成员变量:随着对象的创建而加载
4.储存位置不一样:静态变量:储存在方法区中
成员变量:储存在堆中
静态代码块:
初始化类,随着类的加载而运行(类加载时类的所有信息都会被加载到方法区),在类加载时就对类进行初始化
仅执行一次,在类加载时
格式:
static
{
}
代码:
class Demo3{
static private int x=98;//静态变量,默认初始化,显示初始化(成员变量有默认初始化,局部变量没有)
static{
System.out.println("加载时输出的数:"+x);
}
static void Speak(){
System.out.println("Say what!");
}
}
class Demo2{
public static void main(String[] args){
Demo3.Speak();
Demo3.Speak();
}
}
运行结果:
加载时输出的数:98 //只执行一次
Say what! //方法调用一次运行一次
Say what!
//成员变量有默认初始化,局部变量没有默认初始化(在方法中,导致局部变量没有赋值初始化就不能使用)
类中的代码块
{
}
是为对象服务的,是用来初始化对象的(在对象创建时才会执行)