类和对象
对象
定义
类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等
class Pet{
String name;
void showMe(){
System.out.println("Hi,I'm"+name+"!");
}
}
public calss app{
public static void main(String[] args){
Pet a = new Pet;//创建对象
System.out.println("A pet object is created.");
a.name = "Snoppy";//设置对象的属性
a.showMe();//只能用引用名来操控对象,不能通过属性值。Snoppy.showMe()错误 => 因为a是Pet类型,其中有showMe方法,而Snoppy是字符串类型,所有错误。但Snoppy.length()正确。
}
}
对象引用的存储方式
静态内存分配
1.(基于栈的内存管理模式,内存空间自动分配和回收)假定函数孔家你分配在起始地址为0;空间大小为S的内存块上。当函数执行是,把该空间映射到具体的内存空间,执行结束后,把该函数登记的标记删除。
2.接受栈内存管理的数据:在函数定义的所有变量(基本型或引用型)
动态内存管理
1.(基于堆内存管理模式)各子程序共享的内存空间
2.接受堆式内存管理的数据:所有对象空间
对象的引用
1.格式为:对象.成员,如a.length、“abc”.length()
2.常量引用final:引用不可更改
对象数组
String[] sa=new String[10]
不是new了一个class对象(而是数组对象),因此未调用String的构造函数。sa[0]
是String引用,不是String对象。
成员变量和局部变量
成员变量:类中定义的变量,在该类/对象中属于全局变量;所有的成员变量都会被初始(0,false,null),成员常量只能在定义时或是构造函数中赋值。
局部变量:方法中定义的变量,局限于该方法。
类
一个模板,它描述一类对象的行为和状态 ,=数据+操作(类名一般首字母大写)
public class Dog{
String breed;
int age;
String color;
void barking(){ }
void hungry(){ }
void sleeping(){ }
}//barking()、hungry() 和 sleeping() 都是 Dog 类的方法
-
注意:
1.若文件中public类,类名必须同文件名相同。
2.空类:如class Species{}
3.Java中是根据类的名字作区分,而非内容。
class T1{int x;} class T2{int x;} T1 a;T2 b; a = b;//编译错 a、b是不同的类型
4.变量可以递归定义(单链表)。
class LinkNode{ Pet String; LinkNode next; }
构造函数
构造函数的特点:
1、与类名相同;
2、不能用return返回一个值,也不能有任何返回类型(包含void)换言之,无返回类型,实际上,就是默认只能返回该类名代表的类型
3、构造函数的作用:对属性进行初始化
class Car(){
String owner,brand,color;
Car(String o, String b, String c){ owner=o; brand=b; color=c; }
public String toString(){//注意:必须有public、返回必须是String型、必须无参
return "车主:"+owner+" 品牌:"+brand+" 颜色:"+color;
//return " 品牌:"+brand+" 颜色:"+color;
//此函数的功能:会被System.out.print()在【打印对象时】自动调用;
}
}
class App{
{
Car c=new Car("张三","奇瑞","黑色");
Car c1=new Car(); //此句编译错,即有若类中定义构造函数,系统将不再补充任何构造函数
System.out.print(c);
}
}
实例
/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();
//public类名必须和文件名相同
public class Puppy{
int puppyAge;
public Puppy(String name){
// 这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public void setAge( int age ){
puppyAge = age;
}
public int getAge( ){
System.out.println("小狗的年龄为 : " + puppyAge );
return puppyAge;
}
public static void main(String[] args){
/* 创建对象 */
Puppy myPuppy = new Puppy( "tommy" );
/* 通过方法来设定age */
myPuppy.setAge( 2 );
/* 调用另一个方法获取age */
myPuppy.getAge( );
/*也可以像下面这样访问成员变量 */
System.out.println("变量值 : " + myPuppy.puppyAge );
}
}
//小狗的名字是 : tommy 小狗的年龄为 : 2 变量值 : 2