基本和引用数据类型
存储方式 数据类型总结 jvm运行时数据区域 方法区 虚拟机栈! 本地方法栈 堆! 程序计数器 虚拟机栈 其中存放了编译器可知的基本类型和对象引用,还有returnAddress 堆 jvm规范规定:所有的对象实例以及数组都在这里分配内存基本数据类型没有方法,引用数据类型有方法
方法的传参方式
形参不影响实参 值类型参数是基本数据类型:传值形参影响实参 引用类型参数是引用数据类型:传址形参不影响实参 字符串类型参数是String需要考虑其不可变性
package com.fgy.java8se;class User{ int age=20;}public class Demo7 { void m1(int i){ i++; System.out.println(i); } void m2(User user){ user.age++; System.out.println(user.age); } void m3(String ss){ ss+="abc"; System.out.println(ss); } public static void main(String[] args) { //形参不影响实参 值类型 //参数(形参与实参)是基本数据类型:传值(按值传递),拷贝一份 int j=0; Demo7 demo=new Demo7(); demo.m1(j); System.out.println(j); //形参影响实参 引用类型 //参数是引用数据类型:传址 System.out.println("-----------------"); User user=new User(); user.age=30; demo.m2(user); System.out.println(user.age); //形参不影响实参 字符串类型 //参数是String需要考虑其不可变性 System.out.println("-----------------"); String s="123"; demo.m3(s); System.out.println(s); }}
变量的作用域
作用域的概念 局部变量与成员变量 作用域:scope 有时也叫visibility可见性,是指变量能够被访问的代码块 局部变量 局部变量是指定义在方法,构造方法或代码块中的变量,也包括方法的参数。其作用域较小 特点: 没有初始化的值 赋值之前不能访问 可以声明在方法体的任意地方,只要在使用之前就可以 局部变量可以与成员变量同名 先去找局部变量,再去找成员变量,就近原则 成员变量 成员变量是指声明在类中的属性,可以在类的任何位置访问到,可以认为是成员变量package com.fgy.java8se;public class Demo8 { int aa=50; void m1(){ int num1=10; //这里就可以访问成员变量aa System.out.println(aa); } //局部变量,不能访问另一个方法的num1 void m2(){ //System.out.println(num1); } public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); } //局部变量,不能访问for中的i //System.out.println(i); if (1==1) { int num=10; } //局部变量,不能访问if中的num //System.out.println(num); }}
static关键字
static关键字概述及其使用场景 static变量 static方法 static导入 static代码块 使用场景 属性 方法 导入 代码块 内部类(后续课程介绍) static变量 该变量属于类,一般称为类变量 所有实例共享该变量的值 使用类直接访问 不可直接将非静态变量赋值给静态变量 static方法 也称为类方法(普通方法称为实例方法) 一般是工具类中的方法 使用类直接访问 不能直接访问非静态变量或方法 static导入 用于导入类中的静态方法和静态属性 import static 包名.m1; 然后直接调用,不用类名.m1来调用了 static代码块 类的组成部分之一 类由属性,方法,代码块,静态代码块,内部类组成。 实例化之前执行 只会执行一次 框架或设计模式时会用到,一般不用
package com.fgy.java8se;public class Demo9 { //下面的成员变量(也叫属性)要通过它所归属的类实例化,打点引用访问 int num; static int num1; //不可将非静态变量赋值给静态变量 //static int num2=num; void m(){ //static int num3=10; } public static void main(String[] args) { //下面实例化后,就可以调用了,每个实例化后的对象各不相干 Demo9 d1=new Demo9(); d1.num=10; //用对象打点来调用没有问题 d1.num1=80; Demo9 d2=new Demo9(); d2.num=20; //用对象打点来访问没有问题 d2.num1=60; //但最好用类打点的方式来访问,因为它是一个静态成员变量 Demo9.num1=50; System.out.println(d1.num+","+d2.num); System.out.println(Demo9.num1+","+d1.num1+","+d2.num1); }}
package com.fgy.java8se;//静态导入//import static com.fgy.eclipse.Fish.swim;import static com.fgy.eclipse.Fish.*;public class Demo10 { //代码块,这是实例化对象时最后执行的,执行多次 { System.out.println("jjjj"); } //静态代码块,这是实例化对象时最先执行的,只执行一次 static{ System.out.println("hello"); } static void m1(){ for (int i = 0; i < 5; i++) { System.out.println(i); } } public static void main(String[] args) { //同一个类中,静态方法调用静态方法,直接调用 m1(); swim(); Demo10 d1=new Demo10(); Demo10 d2=new Demo10(); Demo10 d3=new Demo10(); }}
构造方法的概念
构造方法的语法特征与特点构造方法的使用 构造方法是在创建对象后立即初始化对象的命名代码块 方法名与类名完全一致 不能有返回值类型 没有显式构造方法时,编译器会提供一个默认的无参构造方法,其访问控制修饰符与类一致 一旦提供显式的构造方法时,就没有默认的构造方法 构造方法由new或其它构造方法调用(this和super关键字时会讲到其它构造方法的调用) 只有两个判断标准,有没有返回值类型,方法名与类名是不是相同 使用构造方法初始化对象的属性值 无参的构造方法通过new来实例化,调用赋值通过打点来实现 有参的构造方法通过new来传递实参到方法中,方法中进行赋值
package com.fgy.java8se;public class Demo11 { //方法名与类名完全一致 //不能有返回值类型 //没有显式构造方法时,编译器会提供一个默认的无参构造方法,其访问控制修饰符与类一致 //一旦提供显式的构造方法时,就没有默认的构造方法 //下面的没有返回值类型void,方法名与类名一致Demo11,默认提供一个无参的 //构造方法,访问控制修饰符与类一致。是一个默认的无参构造方法/* public Demo11(){ } */ public Demo11(int age,String name){// age=age;// name=name; //上面的两个没什么意义,我们的本意是将形参赋给成员变量,所以这里就要用到this this.age=age; this.name=name; } int age; String name; public static void main(String[] args) { //构造方法由new或其它构造方法调用 //无参的构造方法与有参的构造方法,如果两种都提供,就叫做方法的重载 //通过有参的构造方法为对象赋初始值 Demo11 d1=new Demo11(40,"ni"); System.out.println(d1.age+" "+d1.name); //下面是为无参的构造方法赋值/* d1.age=20; d1.name="aaa";*/ }}
package com.fgy.java8se;public class Co { int x; int y; public Co(int x,int y){ this.x=x; this.y=y; } public static void main(String[] args) { Co c1=new Co(3, 5); System.out.println(c1.x); }}