一,类的编写过程
使用java代码表示学生类
开始编写学生类
class Student{
//静态特征(属性):姓名 性别 年龄
//变量 但是只有数据类型和名称
String name;//姓名
int sex;//性别
int age;//年龄
//动态特征(行为):学习
//方法,但是此时修饰符不要写static
public void study(){
System.out.println("学生学习");
}
}
二,类和对象的关系
面向对象倡导万物都是对象
类:是实际生活中某类事物的属性以及相关的行为的抽象集合。
对象:对象时类具体化的一个实例(类具体化了就是对象即实例)。
三,对象的使用语法:
对象的使用方式:
使用类就是使用对象(实例)。
类是定义的,对象(实例)是使用的。
1,创建对象
类名称 对象名称(变量名称)=new 类名称();
2,使用对象
使用对象的属性(成员变量、对象变量、实例变量)
对象名称 . 属性名称=值;(这个值的数据类型必须和类中定义属性时的数据类型一致)。
使用对象的行为
对象名称 . 行为名称(参数值……);
eg:
//定义汽车类(类似汽车图纸)
class Car{
//静态特征 属性
String color;
double price;
double xingNeng;
public void drive(){
System.out.println("汽车开始行使");
}
}
public class ObjectDemo{
public static void main(String[] args){
//根据汽车图纸创建一辆汽车
//创建汽车类的一个对象
Car c=new Car();
//给汽车上颜色
//为 c 对象的color成员变量赋值
c.color="红色";
//System.out.println("汽车 c 的颜色是:"+c.color);
//为 c 对象的price成员变量赋值
c.price=1.23;
//System.out.println("汽车 c 的价格是:"+c.price);
//调用 c 对象的drive方法,让汽车开始行使。
c.drive();
}
}
一个对象的使用过程内存图解
drive方法执行完空间释放,main方法不调用也释放。
注意:
1,标记属于指针,指向另外一块内存。
2,在JVM中会为每块内存定一个地址值,一般是十六进制 0x0001
3,class类或Car类第一次使用需要加载进内存,只需要加载一次。
4,Car c创建在main方法中,Car也可以叫局部变量, c 叫对象名称
5,new在堆内存中开辟空间,创建完对象立即为成员变量开辟空间,并未成员变量赋默认初始化值
6,当执行到c.color的时候,才到堆内存去显示初始化值。
四,对象的创建过程内存图(初步讲解)
1,类的加载
在类第一次使用之前需要被加载如内存
类的描述信息放入方法区
2,对象的创建
为对象在堆内存开辟空间
为对象的成员变量开辟空间并默认初始化
默认值:
byte short int long 0
float double 0.0
boolean false
char ‘ ’
其他类型 null
3,对象的使用
五,对象的成员变量、成员方法内存图解
由一个类创建两个不同对象
1,每个对象都有一份自己的成员变量
2,所有对象共享方法描述
class Car1{
String color;
double price;
double xingNeng;
public void drive(){
System.out.println("汽车开始行使");
}
}
public class ObjectDemo1{
public static void main(String[] args){
Car1 x1=new Car1();
x1.color="红色";
System.out.println("x1 颜色:"+x1.color);
x1.price=1.23;
System.out.println("x1 价格:"+x1.price);
x1.drive();
Car1 x2=new Car1();
x2.color="黑色";
System.out.println("x2 颜色:"+x2.color);
x2.price=2.23;
System.out.println("x2 价格:"+x2.price);
x2.drive();
}
}
六,对象的引用复制
对象引用的复制就是地址值的复制
class Car2{
String color;
double price;
double xingNeng;
public void deive(){
System.out.println("汽车开始行使");
}
}
public class ObjectDemo2{
public static void main(String[] args){
Car2 x1=new Car2();
x1.color="红色";
System.out.println("x1 颜色:"+x1.color);
Car2 x2=new Car2();
x2.color="黑色";
System.out.println("1 x2 颜色:"+x2.color);
Car x3=x2;
x3.color="白色";
System.out.println("x3 颜色:"+x3.color);
System.out.println("2 x2 颜色:"+x2.color);
}
}
七,基本数据类型和引用数据类型做方法参数的区别:
1,基本数据类型做方法参数,
基本数据类型传递的是具体值 传递值 往往不会改变原有值
2,引用数据类型做方法参数,
引用数据类型传递的是地址值 地址传递 通常改变原有值
eg:
class T{
int i;
}
public class ObjectDemo3{
public static void main(String[] args){
//基本数据类型做方法参数
int i=10;
System.out.println("1 i="+i);//10
chengeValue(i);
System.out.println("2 i="+i);//10
//引用数据类型做方法参数
T tt=new T();
tt.i=10;
System.out.println("1 tt.i="+tt.i);//10
chengeValue(tt);
System.out.println("2 tt.i="+tt.i);//20
}
public static void chengeValue(int i){
i=20;
}
public static void chengeValue(T tt){
tt.i=20;
}
}
八,成员变量和局部变量的区别:
1,代码编写位置不同
成员变量是在class内部,所有方法外部
局部变量必须在方法内部定义
2,在内存中的位置不同
成员变量在堆内存
局部变量在栈内存
3,创建时机不同
成员变量是随着对象的创建而创建
局部变量是随着方法的执行而创建
4,初始化值不同
成员变量会被默认初始化
局部变量必须被显示初始化
注意:如果成员变量和局部变量有相同名称,则符合就近原则
eg:
class E{
//int i;
int i=10;
public void test(){
//int j=20;
//int j;定义变量 j
//以上代码只是定义并没有初始化,所以下面输出代码错误,变量在使用之前必须被初始化完毕
//System.out.println(j);
int i=20;//局部变量
//局部变量和成员变量的就近原则,那个语句近就输出谁。
System.out.println(i);
}
}
public class ObjectDemo4{
public static void main(String[] args){
E ee=new E();
//System.out.println(ee.i);//10
ee.test();//20
System.out.println(ee.j);语法错误,注意 j 的作用域,不能再另外一个方法中直接调用
//测试成员变量和局部变量同名称输出结果
ee.test();//20
}
}
九,匿名对象
就是没有名字的对象
class P{
public void test{ }
}
public class ObjectDemo5{
public static void main(String[] args){
//创建P类的一个对象
P pp=new P();
//按照以上的写法,对象的名称叫pp
//调用Test方法
//pp只是一个指针,指向对象,把pp定为对象的名字
//那么pp.test()实际上就是对象调用的自己的方法Test
pp.test();
//一下使用匿名对象的方式
//new P();
new P().test();
}
}