类
类、字段、方法
- 类
- 类是组成Java程序的基本要素(写程序就是写一个个类)
- 是一种类对象的原型
- 它封装了一类对象的状态和方法
它将变量与函数封装到一个类
class Person{
String name;//字段
int age;//字段
void sayHello(){//方法
System.out.println("Hello! My name is"+name);
}
}
- 字段和方法(可以说写类的目的就是要写字段和方法)
- 字段是类的属性,是用变量来表示(字段又称域,域变量、属性、成员变量等)
- 方法是类的功能和操作,是用函数来表示的
- 构造方法(任何一个对象都要构造,所以一般情况下,类都有一个至多个构造方法)
- [ ] 构造方法是一种特殊的方法
- [ ] 用来初始化(new)该类的一个新的对象
- [ ] 构造方法和类名同名,而且不写返回数据类型
Person(String n,int a){
name=n;
age=a;
}
如果没有定义任何构造方法,系统会自动产生一个构造方法,称为默认构造方法,默认构造方法不带参数,并且方法体为空`
Person{}`
- 使用对象
- 访问对象的字段或方法,需要用算符"."
Person p=new Person();//创建一个对象,通过引用来访问
System.out.println(p.name);//引用对象的变量
p.sayHello();//引用对象的方法
这种使用方式的好处:封装性、安全性
- 方法重载
- 方法重载:多个方法有相同名字,编译时能识别出来
- 这些方法的签名(类型)不同,或者是参数个数不同,或者是参数类型不同
void sayHello(){}
double sayHello(){}
void(int name){}
void sayHello(String name){}
void sayHello(String name,int age){}
通过方法重载实现多态
- 类的继承
- 子类(subclass),(继承)父类或超父类(superclass)
- 父类包括所有直接或者间接被继承的类
- Java支持单继承:一个类只能有一个直接父类(一个孩子只有一个父亲)C+±-
- 子类继承父类的状态和行为
可以修改父类的状态或重载父类的行为
可以添加新的状态和行为 - 继承的好处:
可以提高程序的抽象程度(学生是人、老师也是人)
实现代码重用,提高开发效率和可维护性 - Java中继承是通过extends关键字来实现的
class Student extends Person{
}
如果没有extends句子,则该类默认为java.lang.Object的子类
所有的类都是通过直接或间接的继承java.lang.Object得到
- 继承关系在UML图中,是用一个箭头来表示子类与父类的关系的
类Student从类Person继承,定义如下:
class Student extends Person{
String school;
int score;
boolean isGood(){return score>80;}
//.......
}
- 字段继承
- 子类可以继承父类的所有字段
- Student自动具有Person的属性(name,age)
- 字段的隐藏(一般不用)
- 子类重新定义一个与从父类那里继承来的域变量完全相同的变量,称为域隐藏。
- 字段的添加
- 在定义子类时加上新的域变量,可以使子类比父类多一些属性。如
class Student extends Person{
String school;//字段的添加
int score;//字段的添加
boolean isGood(){return score>80;}
//.......
}
- 方法的继承
- 父类的非私有方法也可以被子类自动继承。如Student自动继承Person的方法sayHello
- 方法覆盖(修改、改写)
- 子类也可以重新定义与父类同名的方法,实现对父类方法的覆盖
void sayHello(){
System.out.println("Hello! My name is"+name+"My school is"+school);
}
通过方法的覆盖,能够修改对象的同名方法的具体实现方法
- 方法的添加
class Student extends Person{
String school;
int score;
boolean isGood(){return score>80;}//方法的1添加
//.......
}
子类可以新加一些方法,以针对子类实现相应的功能。
- 方法的重载(比较特殊的添加)
- 一个类中可以有几个同名的方法,这称为方法的重载。同时,还可以重载父类的同名方法。与方法覆盖不同的是,重载不要求参数类型相同。重载的方法实际是新加的方法。
void sayHello(Student another){}
super的使用
- 使用super访问父类的域(变量)和方法
注:正是由于this可以访问父类的域和方法。但有时为了明确的指出父类的域和方法,就要用到关键字super
例如:
class Person{
String name;//字段
int age;//字段
void sayHello(){//方法
System.out.println("Hello! My name is"+name);
}
}
class Student extends Person{
String school;
int score;
boolean isGood(){return score>80;}
void testThisSuper(){
int a;
a=this.age;//Student的age
a=super.age;//Person的age(但这里的age指的是同一个age的只是为了方便区分子类和父类)
}
}
当然,使用super不能访问在子类中添加的域和方法
有时需要使用super以区别同名的域与变量。比如:当覆盖父类的同名方法的同时,又调用父类的方法,就必须用super。
class Person{
String name;//字段
int age;//字段
void sayHello(){//方法
System.out.println("Hello! My name is"+name);
}
}
class Student extends Person{
int age;
String school;
int score;
boolean isGood(){return score>80;}
void testThisSuper(){
int a;
a=this.age;
a=super.age;
}
void sayHello(){//调用父类的sayHello然后再加一些行为
super.sayHello();
System.out.println("My school is"+school);
}
}
在覆盖父类的方法的同时,又利用已经定义好的父类的方法。