初始面向对象
初始面向对象
创建对象的时候:new Code02();就会调用构造函数创建完对象了。
static修饰的变量叫做类变量,也叫静态变量.类变量是整个类和对象所共有的。
实例变量是相互隔离的。
static修饰的方法叫做类方法,也叫静态方法 static{}叫做静态块,最先被加载(优先加载)不能显示调用,且只能加载一次
public class Code01 { static {//静态块 System.out.println("这是静态块"); } Code01(){ System.out.println("这是构造方法"); } public static void main(String[] args) { Code01 code01 = new Code01(); //Java里面只要new了,就肯定在堆内存上开辟了新的空间 Code01 code02 = new Code01(); Code01 code03 = new Code01(); //这是静态块 //这是构造方法 //这是构造方法 //这是构造方法 } }
构造函数的作用就是完成类中变量的初始化 Java构造函数的名字和类名必须一致,没有返回值的修饰,有没有修饰符都可以 如果一个类中没有显示的提供构造函数,Java编译器会隐式的提供一个默认无参的构造函数 如果一个类中没有显示的提供构造函数,那么Java构建对象时必须依赖类中提供的构造函数
public class Code02 { public Code02() { System.out.println("构造函数"); return; //可以有返回但不能加具体的值,否则爆红 // System.out.println("构造函数以"); return之后不能有其他的语句否则爆红 } public static void main(String[] args) { new Code02(); //构造函数 } }
创建对象之前会调用匿名构造块
静态块:只会调用一次
匿名构造块:创建对象一次执行一次,在执行构造函数之前执行。
public class Code03 { static { System.out.println("静态块"); } { System.out.println("匿名构造函数"); } Code03() { System.out.println("默认无参构造函数"); } Code03(String name) { System.out.println("有参构造函数,参数为:"+name); } public static void main(String[] args) { new Code03(); /* 静态块 匿名构造函数 默认无参构造函数 */ new Code03("MoonStone97"); /* 匿名构造函数 有参构造函数,参数为:MoonStone97 */ } }
简单描述一下栈内存和堆内存
String s1=new String();
栈内存:是存放Java声明的基本数据类型(4种8个)和声明的引用类型String s1;效率高,程序运行结束,栈内存就释放。
堆内存:存放Java new出来的对象,new String();效率低,因为new这个对象是在程序运行期间才去创建,执行后,new这个内存。而是Java虚拟机去自动回收Java中只要new了,就肯定在堆内存上开辟了新的内存空间。
static变量是存放在静态全局数据区,是所有对象和类共同指向的内存区域。
this的使用,this就是代指本次创建的对象、引用类型的赋值
public class Code01 { String name; //姓名:实例变量 static int count; //访问次数:类变量 public Code01(String name){ this.name=name; } public static void main(String[] args) { Code01 code01 = new Code01("对象一"); Code01 code02 = new Code01("对象二"); code01.name="100"; System.out.println("code02.name的值:"+code02.name); //code02.name的值:对象二 Code01 code03=code01; //引用类型的赋值,改变了对象的指向;实际就是把code01对象的地址赋给code03 System.out.println("code03.name的值:"+code03.name); //code03.name的值:100 Code01.count=15; System.out.println(code01.count+" "+code02.count); //15 15 } }
静态块、匿名构造函数、构造函数的执行顺序(包括全局变量与局部变量的修改)
public class Code02 { int age; static String address; static {//静态块的访问规则和静态方法相同,不能直接使用实例变量 //age=10; 爆红 //在静态块中要使用实例变量,需要通过对象进行调用 Code02 code02 = new Code02(25); System.out.println("静态块:"+address+" , "+code02.age); //静态方法可以直接使用类变量 } { age=50; address="南京"; System.out.println("匿名块:"+address+" , "+age); } public Code02(int age) { this.age = 20; } public static void main(String[] args) { new Code02(15); /* 匿名块:南京 , 50 静态块:南京 , 20 匿名块:南京 , 50 */ } }
局部变量与全局变量一
public class Code03 { int num=5; public Code03() {//局部变量 int num = 100; } public Code03(int num) { this.num = num; } public static void main(String[] args) { Code03 code03 = new Code03(); System.out.println(code03.num); //5 Code03 code04 = new Code03(110); System.out.println(code04.num); //110 } }
局部变量与全局变量二
public class Code04 { int age=10; static { //this关键字不能用在static修饰的块和方法中 //this.age=24; 爆红 } public static void check(){ //this关键字不能用在static修饰的块和方法中 //this.age=100; 爆红 } public void display(){ this.age=100; //this关键字可以在构造函数和实例方法中使用,代表当前对象 } }
this关键字的使用
public class Test { int age; public Test(){ //this 代表当前对象this(参数),代表访问类中和这个参数类型一致的构造函数===》public Test(int age){age=100;} this(20); } public Test(int age){ age=100; } public static void main(String[] args) { Test test = new Test(); System.out.println(test.age); //0 } }