一、类和对象的创建
类的结构包括对象和方法;
创建类的方法:
1.创建类,设计类的成员
2.创建类对象 格式:类名 对象名=new 类名()
3.通过“对象,属性”或“对象,方法”调用对象的结构
代码如下:
public class classTest {
public static void main(String[] args)
{
Person p=new Person();//创建对象
//调用类成员
p.eat();
p.setNameandAge("张三",18);
System.out.println(p.name+"\t"+p.age);
}
}
class Person//创建类
{
//创建类成员
String name;
int age=1;
public void eat()
{
System.out.println("人可以吃饭");
}
public void setNameandAge(String n,int a)
{
name=n;
age=a;
}
}
匿名对象:
1.创建对象时,没有显式的赋给一个对象名,即匿名对象
2.匿名对象只能使用一次
以上面代码为例,例如:
new Person().eat();
new Person().age=18;
属性(成员变量)和局部变量的对比:
相同点:1.定义格式:数据类型 变量名=变量值
2.先声明,后使用
3.都有其作用域
不同点:
①在类中声明的位置不同:
属性(成员变量)直接定义在类的一对{}内;
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
②属性(成员变量):可以在声明属性时,指明其权限,使用权限修饰符.(private,public,protected,缺省)
局部变量:不可以使用权限修饰符
③属性(成员变量)有默认初始化值;
局部变量没有默认初始化值,在调用他之前,要对其显式赋值
④属性加载到堆空间
局部变量加载到栈空间
对象数组
定义格式:类名[] 对象名=new 类名[长度];
例如Student[] stus=new Student[10];
通过循环对数组元素赋值
for(int i=0;i<stus.length;i++)
{
//给数组元素赋值
stus[i]=new Student();
//给属性赋值,例如成绩【0,100】
stus[i].score=(int)(Math.random()*(100-0+1);
}
简要说明以下JVM内存结构:
编译完成后,生成一个或多个字节码文件。在使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行。意味着需要在字节码文件对应的类加载到内存中,涉及到内存解析
JVM规范
虚拟机栈,因为平时提到的栈结构,我们将局部变量存储在栈结构中,
堆,我们将new出来的结构(数组,对象)加载在堆空间中。其中对象的属性(非static的)加载在堆空间中
方法区:类的加载信息,常量池,静态域..
关于方法的重载的说明:(作用域要相同)
1.在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可
关于可变个数形参:允许直接定义能和多个实参匹配的形参(JavaSE 5.0)
1.格式:数据类型...变量名
2.可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
3.可变个数形参的方法与本类方法名相同,形参类型也相同的数组之间不构成重载,二者不能并存
4.可变个数形参在方法的形参中,必须声明在末尾
5.可变个数形参在方法的形参中,最多只能声明一个可变形参
二、封装性
封装性的体现:
将类的属性私有化(private),同时,提供公共的(public)方法来获取和设置此属性的值
拓展:
不对外暴露的私有方法也是封装性的体现
1.四种权限(从小到大):private、缺省、protected、public
2.这个四种权限可以修饰类及类的内部结构,属性,方法,构造器,内部类
修饰类只能用缺省或public
构造器(constructor)的使用
一、构造器的作用
创建对象 例如: Person p=new Person(); Person()就是一个构造器
初始化对象的属性
1.没有显式调用定义类的构造器,系统会默认提供一个空参的构造器,默认构造器的权限与所定义类的权限相同
2.定义格式: 权限修饰符 类名(形参列表){}
3.一个类中定义多个构造器,彼此构成重载
4.显式定义构造器后,系统不在提供默认空参构造器
拓展:
满足类是公共的、有一个无参的公共构造器、有属性,且有对应的get.set方法成为JavaBean;
this的使用
this可以用来修饰属性、方法、构造器
this可以理解为当前对象
在类方法中,可以使用“this.属性”或“this.方法”的方式,调用当前对象属性或方法,通常情况下省略this. 如果方法的形参和类的属性同名时,则必须显式定义“this.变量”,表明此变量是属性。
如下所示情况:
class Person
{
private int age;
public void setAge(int age)
{
this.age=age;
}
};
package关键字
使用package声明类或接口所属的包,声明在源文件首行
命名时每“.”一次,代表一层文件目录
补充:同一个包下,不可以命名同名的接口、类.
不同包下可以
import关键字
1.在源文件中显式的使用import结构导入指定包下的类、接口
2.声明在包的声明和类的声明之间
3.如果导入多个结构,并列写出即可
4.使用“xxx”.*的方式,表示可以导入xxx包下的所有结构,如果使用xxx子包下的结构,仍需显式导入
5.如果使用的类或接口是java.lang包下定义的,则可省略import结构
6.如果使用的类或接口是本包下定义的,则可省略import结构
7.如果在源文件中,使用了不同包下的同名类,则必须至少有一个类需要以全类名的方式显式
8.import static:导入指定类或接口的静态结构:属性或方法