类和对象

来源:互联网 发布:seo教程网 编辑:程序博客网 时间:2024/05/20 15:38

Java是一门面向对象的语言,类和对象是Java的基础和核心。

1.什么是类和对象

先以一段简单的代码来了解一下类和对象

//定义一个类,名为Student

public class Student{

public String name;//定义学生类的name属性

pubic int age;

public String school;

public void eat(){

System.out.println(name+”年龄为”+age+”就读于”+school+“正在吃东西”);

}

}

public class Demo1{

public static void main(){

//实例化一个学生类的对象

Student stu=new Student();

stu.name=”张三”;//对象的名字叫张三

stu.age=21;

stu.school=”中南大学”;

stu.eat();

}

}

运行输出结果为:张三年龄为21

从上述代码可知,类是由属性和方法构成,类中的方法分为普通方法和构造方法两种。其中属性表示类的特征而普通方法则代表类的行为和功能(构造方法将在下文另做说明)。类是一个抽象的概念。如上述代码中的学生类,学生代表的是一个群体(一类人),是抽象的。抽象的概念无法直接使用,需要实例化一个对象。(学生类不能实现“吃东西”这个行为,只有某一个学生才能“吃东西”)对象是抽象类的具体化(实例化),可以直接使用。

2.类定义的格式

定义类的关键字:class

定义类的格式

public class 类名{//给类命名时最好每个单词首字母均大写

//定义属性的格式

访问修饰符 数据类型 变量名;

//定义构造方法的格式

访问修饰符 构造方法名(数据类型 参数名,...){

方法体;

}

//定义普通方法的格式

访问修饰符 返回值类型 方法名(数据类型 参数名,...){/*给方法命名时除第一个单词外每个单词首字母都大写

*/

方法体;

}

}

3.实例化对象以及对象调用类中属性和方法的格式

实例化对象的关键字new

实例化对象的格式:

类名 对象名=new 类名(参数值,...);

对象调用类中属性的格式:

对象名.属性名;

对象调用类中方法的格式:

对象名.方法名(参数值,...);

4.构造方法

同样先通过一段代码来简单的了解构造方法

//定义一个Teacher老师类

public class Teacher{

//定义类的属性

private String name;

private int age;

//定义类的构造方法

public Teacher(String name){

this.name=name;

}

public Teacher(String name,int age){

this.name=name;

this.age=age;

}

public Teacher(String name,int age,String subject){

this(name,age);

this.subject=subject;

}

//定义类的普通方法

public void teach(){

System.out.println(this.name+"年龄为"+this.age+"正在教"+this.subject);

}

}

public class Demo2{

public static void main(){

Teacher t1=new Teacher(“张三”);

Teacher t2=new Teacher(“李四”,28);

Teacher t3=new Teacher("王五",30,math);

t1.teach();

t2.teach();

t3.teach();

}

}

程序运行结果为:张三年龄为0正在教null

李四年龄为28正在教null

王五年龄为30正在教数学

(1)定义构造方法的格式:

访问修饰符 构造方法名(数据类型 参数名,...){

方法体;

}

注意:1)构造方法无任何返回值类型的说明

2)构造方法的名字必须与类名完全相同

3)每个类中至少有一个构造方法,如用户未定义则系统默认生成一个什么都不做的构造方法(如Student类未定义构造方法,系统自动生成了一个构造方法:public 类名(){}),若用户定义了一个构造方法则系统生成的构造方法会被覆盖无法使用。(如Teacher类中定义了三个带参数的构造方法,则系统自动生成的无参构造方法无法再使用,若在实例化对象时使用Teacher t1=new Teacher();则会出错)

(2)构造方法的作用:

1)实例化一个对象(通过new关键字开辟一个空间把对象所属类拥有的属性和方法以及对象的属性值存储在其中),并返回new关键字开辟的内存空间地址名返回给对象名

2)为属性赋值(如Demo2中在实例化Teacher对象时可同时为相应的属性赋值)

(3)构造方法与普通方法的区别

1)格式的区别:普通方法定义时必须带上返回值类型(若没有返回值则定义为void),普通方法命名时无特殊要求,且一个类中可没有普通方法。构造方法定义时不能有任何返回值类型的说明构造方法名必须与类名完全一致类中不能没有构造方法

2)作用的区别:构造方法用来实例化对象和为属性赋值而普通方法是用来完成特定的行为和功能的

3)调用的区别:构造方法通过new关键字来调用,且只能在实例化对象的时候调用一次。而普通方法通过对象名调用,可以随时调用多次调用。

(4)方法的重载

Teacher类中我们定义了三个方法名完全一样的构造方法,这种现象我们叫做方法的重载。(普通方法和构造方法都可进行重载

方法重载满足的条件

1).方法名完全一样

2).方法中参数的类型,个数或者顺序不一样

在调用时根据参数的不同,调用不同的方法

使用方法重载的场景

当需要对不同的参数进行相同的行为时可使用方法的重载

(5)this关键字

作用:1).表示当前的对象,相当于“我”(Demo2类中t1,t2,t3分别调用teach()方法时,teach()方法中的this分别表示t1,t2,t3对象)

2).当参数名与属性名相同时,在属性名前加上this以区分参数名和属性名(如teacher类中this.name=name;语句)

3).this(参数值);调用本类中的构造方法,用this调用构造方法时必须放在方法的首行,并且this在调用构造方法时至少需要一个构造方法作为出口(即至少有一个构造方法没有使用this调用其他构造方法

5.类的继承

public class Person{

public String name;

public int age;

public void work(){}

}

//worker继承Person类

public class Worker extends Person{

public static void main(){

public int salary;//定义子类特有的属性

//重写父类中的方法

public void work(){

System.out.println(this.name+"正在工作工资为"+salary);

}

}

//定义子类中特有的方法

public void eat(){

System.out.println(this.name+"正在吃饭工资为"+salary);

}

Worker w=new Worker();

w.name="赵六";

w.age=30;

w.salary=3000;

w.work();

w.eat();

}

}

程序运行的结果为:赵六正在工作工资为3000

赵六正在吃饭工资为3000

1)类继承的格式

类继承的关键字:extends

public class 子类名 extends 父类名{

子类属性;

子类方法;

}

2)继承的内容

子类可以继承父类所有的属性和方法(上例中Worker继承了Person类,拥有了Person类中的所有属性和方法)

3)方法的重写

上例中子类和父类中都有一个work()方法,但是方法体不同,这种现象就叫做方法的重写

方法重写的条件

1)必须存在继承关系,即只有子类才可以重写父类中的方法

2)方法名,参数类型,参数个数,参数顺序与父类中的方法完全一样,返回值类型是父类的返回值类型或者是父类返回类型的子类

3)子类重写的方法的访问修饰符的类型要大于或者等于父类方法中的访问修饰符

重写后方法的调用

根据new关键字后的类名来确定,若类名为子类则优先调用子类中重写过的方法(若子类中没有这个方法则调用父类中的方法)。若类名为父类则调用父类中的方法

为什么要进行方法的重写

若子类与父类的行为的内容不一样,则需进行方法的重写,但是如果父类根本没有此行为此子类需要定义自己特有的方法(比如父类和子类都需进行“吃”这个行为,但是“吃”的东西不一样就需要重写方法,如果父类不需要进行“吃”这个行为而子类需要那么就意味着父类中没有“吃”这个方法,子类就需要自己定义一个特有的“吃”这个方法)

方法重写与方法重载的区别

1)构造方法只能进行重载不能进行重写

2)方法重载是在同一个类中进行的而方法重写是在有继承关系的子类中进行的

3)方法重载要求方法名一致,参数不一致,对访问修饰符和返回值类型以及抛出的异常没有要求,方法的重写要求方法名,参数一致,访问修饰符大于或者等于父类方法的访问修饰符,子类抛出的异常应该是父类抛出的异常或者父类抛出异常的子类,返回值类型是父类的返回值类型或者父类返回值类型的子类

4)super关键字

作用:调用父类中的构造方法,属性和普通方法

注意:

1)super在调用父类中的构造方法时必须放在首行,在调用构造方法时this和super不能同时出现

2)利用super可以调用父类中被子类中覆盖过的方法,如

public class A{

public void action(){}

}

pubilc class B extends A{

public void action(){}

}

在子类B中重写了A中的action()方法,若要在子类中调用父类中的action方法则可以用super调用

3)不管子类中有没有用super调用父类中的构造方法,在实例化子类中的对象是都会调用父类中的构造方法