基本和引用数据类型
存储方式
数据类型总结
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);}//局部变量,不能访问另一个方法的num1void 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;//上面的两个没什么意义,我们的本意是将形参赋给成员变量,所以这里就要用到thisthis.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);} }