创建对象:类名 对象名 = new 类名();
类之间的赋值:
Person a = new Person();//系统已经给a分配了一个“Person”空间,即a引用了该空间;
a.age = 10; //给a 空间内的属性赋值
a.name = "小明";
Person b; //定义了一个person类b,但并没有分配空间只是声明了有b(这只是一个名誉校长,学校并没有他的办公室);
b=a; //将b指向a的空间(b是引用了a所引用的空间)(名誉校长回校演讲了,先让他用a校长的办公室吧)
//将输出10
System.out.println(b.age);
内存上如下:
同样修改了b.age=9;则a.age也会变为9.。。
jvm的垃圾回收机制(与c++最大的区别,c++需要手动回收):当分配过的内存空间没有对象引用时,当系统内存不充足时,jvm将会启动垃圾回收机制将这些对象回收。
java 函数的执行原理图:
public void main (String []args)//主函数调用栈
{
Person p1 = new Person();//(每句对应下图1、2、3 4 5)
p1.speack();//开辟新栈
p1.jisuan();//再次开辟新栈
p1.jisuan(100);//...
p1.dancing();//....
}
构造方法的特点(如果不设置构造方法,系统就会自动生成一个默认构造方法(无参),当然自己也可以设置无参的构造方法和有参的构造方法,从而覆盖默认构造方法。):
this: 只能在类定义中使用。
类变量(静态变量):是所有对象共有的。如统计学生共交了多少学费,学生的总共个数等
public class Demo3_1
{
public static void main (String []args)
{
Child p2= new Child(11,"小米");
p2.joinGame();
Child p3= new Child(11,"小天");
p3.joinGame();
Child p4= new Child(11,"大米");
p4.joinGame();
System.out.println("共有"+p2.total+"个小孩");//输出“共有3个小孩”
}
}
//定义小孩类
class Child
{
int age;
String name;
//静态变量,total是静态变量,所以他是所有对象共有的。
static int total=0;
public Child(int age, String name)
{
this.age=age;
this.name=name;
}
public void joinGame()
{
System.out.println("又有一个加入了!");
total++;
}
}
public class Demo3_2
{
static int i=1;
//静态区如下:
static
{
System.out.println("静态区域块执行!");
//静态区域块在构建这个类的定义时触发一次,之后再也不会触发
i++;
}
public Demo3_2()
{
System.out.println("执行构造函数!");
i++;
}
public static void main(String []args)
{
Demo3_2 t1=new Demo3_2();
System.out.println("i="+Demo3_2.i);
Demo3_2 t2= new Demo3_2();
System.out.println("i="+Demo3_2.i);
}
}
静态区域块在构建这个类的定义时触发一次,之后再也不会触发
public class Demo3_2
{
static int i=1;
//静态区如下:
static
{
System.out.println("静态区域块执行!");
//静态区域块在创建这个类的时候就已经执行了一次写入了代码区,之后不再执行,其实暗含初始状态下i==2
i++;
}
public Demo3_2()
{
System.out.println("执行构造函数!");
i++;
}
public static void main(String []args)
{
}
}
从上图可以看出主函数并没有声明对象,就已经执行了该类的静态区域块。(其实在创建含有静态区域块的类时就已经写入了静态区域的内容已经执行并写入了代码区)
静态方法的使用:
静态方法不能访问非静态变量,普通的方法可以访问非静态变量和静态变量。建议使用静态变量采用静态方法访问,节省内存。
public class Demo3_2
{
/*
static int i=1;
//静态区如下:
static
{
System.out.println("静态区域块执行!");
//静态区域块在创建这个类的时候就已经执行了一次写入了代码区,之后不再执行,其实暗含初始状态下i==2
i++;
}
public Demo3_2()
{
System.out.println("执行构造函数!");
i++;
}
*/
public static void main(String []args)
{
Stu stu1=new Stu(15,"小吴",12000);
Stu stu2=new Stu(15,"小军",13000);
Stu stu3=new Stu(15,"小费",12300);
System.out.println("一共收取:"+Stu.getTotalFee());
}
}
//创建一个学生类
class Stu
{
int age ;
String name;
int fee;
static int totalFee;
public Stu(int age,String name , int fee)
{
this.age=age;
this.name=name;
totalFee+=fee;
}
//返回总学费.注:这里面的static可以不写,但是会占用更多的内存。因为不写的话不是静态方法
//非静态方法在每次创建对象时,都会占用相应的内存;而静态方法是公共的只占用一片公共内存即可
//java中的规则:一般情况下,静态变量使用静态方法访问,会节省空间。
//另外:静态方法中的不能访问非静态变量
public static int getTotalFee()
{
return totalFee;
}
}
注:静态是优先于对象存在的,所以静态方法不能访问非静态方法/变量
程序最终都是在内存中执行,变量只有在内存中占有一席之地时才会被访问,类的静态成员(变态和方法)属于类本身,在类加载的时候就会分配内存,可以 通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有在类的对象禅师(创建实例---new)的时候才会分配内存,然后通过类的对象去访问。
在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
那类是什么时候被加载呢?在需要调用的时候被加载。
java----四大(三大)特性
抽象(事物特征的提取)、封装(抽象的属性和属性的操作的封装)、继承(语句:class 子类 extends 父类)(其中:涉及到方法的重载和覆盖)、多态
方法的功能是相同的,但是具体的操作内容不同会用到方法的重载。如比较两个int型的参数大小和比较两个float型参数的大小或比较三个数字的大小。。这时可以将方法名设为一样---------重载。(注意前两条是必须的。)
仅仅第三第四条是不能实现重载的(方法的修饰符是指public、protected....)!!
覆盖(方法的重写):
多态:多态性是允许你将父对象设置成为一个或更多的他的子对象,简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
多态中有时会用到抽象类。
抽象类:注意事项,当一个类继承的父类是抽象类的话,需要我们把抽象类中的所有抽象方法在子类中全部实现。抽象类继承抽象类时可以不覆盖原来的抽象方法。