1.什么是类?
类是一个模版,用来描述一个对象的行为和状态。比如我们想到小狗狗,他有品种、颜色、名字等特征,还具有摇尾巴、吃东西、叫唤等行为。这个时候,我们就可以用一个类来描述一只狗狗。如:
//使用class定义狗狗类;dog是类的名称
class dog{
//下面是狗狗类的特征(类的属性属性)
String breed;
String color;
String name;
//下面是狗狗的一些行为,称为类的方法
void eat()
{
}
void shout()
{
}
void waggingtail()
{
}
}
再比如我们想定义一个学生类,那学生具有学号、姓名、性别等属性,还能够做一些上课、吃饭等行为,我们可以这么写。
class 学生
{
string 学号;
string 姓名;
string 性别;
void 上课()
{
}
void 吃饭()
{
}
}
前面说了,类就是一个模板,他并不是真正的变成了一只狗狗或一个学生,基于这个模版我们能够去创建一只狗狗或者一个学生。
2.类创建好了以后怎么用呢?
我们先拿狗狗的例子来说事情。狗狗类已经定义好了,要基于这个类弄出一只真正的狗狗出来,该怎么办呢? 首先是要基于这个类(模版)去创造一个实例。
dog d = new dog();
然后对这个实例(d)的各个属性进行赋值,也就是给这个狗狗实例(目前还是虚的,像影子一样的存在)安排上品种、颜色、名字等特征。如:
//通过 实例.属性 的方式直接操作属性值
d.breed="拉不拉多";
d.color="白色";
d.name="小白拉";
好了,这只狗就从虚转实了。假如现在“我”想去“抱抱”他,就可以这样了。
我.抱抱(d);
上述过程又相当于我们要盖一个房子,已经定义好了房子的图纸(类,house),接下来我们要先把盖房子的地给整理出来(house h = new house()),这块地上就只能盖基于图纸(类house)的房子h了,然后给这个房子加上石头(h.stone=xx)、窗户(h.window=yy)、门(h.door=zz),有了这些属性,房子(h)就盖好了。然后我们就可以实现“ 我.买(h)”的操作,实现买下这个房子的愿望了,假如还没有加上石头、窗户、门, 我去买就是买了个寂寞。
我们再拿上课时候创建的一个类来做说明。如下:
public class User {
//以下是两个基本属性
private String username;
private String password;
//以下是方法,用来实现上面2个属性的取值、赋值操作
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
上面这个类创建一个用户信息的模版,包含用户名(username)和密码(password)两个属性。并创建了4个方法,4个方法分别实现了对两个属性的取值和赋值操作。(为什么要这么操作呢?稍后解释)
当我们想要基于这个类创建一个用户的时候,就需要对这个类进行实例化,也就是创建一个实例出来。创建的方法如下:
User a = new User();
第一个User相当于是一个数据类型,像我们平时定义整型变量 int a =1; 一样,表示实例a是User类型(你所创建的类实际上就是一个数据类型)。
a表示实例,这个实例是基于User() 新创建(new)的。目前它既没有真正的用户名、也没有密码,我们要通过setUsername和setPassword两个方法对它进行赋值。如:
a.setUsername(“admin”);
a.setPassword(“123456”);
这样一来,实例a就成了有血有肉的一个真实的用户(User)了。
3.类的特征之一:封装性
首先,将某一个对象的属性、方法放在一个类中,这就已经体现了封装的特点。然后你再仔细看一下,在第一问当中,我们定义类没有使用public、private等单词,而在第二问(或者实际项目当中)定义类用到了public (public class User )修饰符,类的属性用到了private(private String username;)进行修饰,为什么要这么做呢?这也涉及到类的封装特征了。
类的封装旨在将类里面信息隐藏在类内部(private),不允许外部程序直接访问,而是通过公有属性来实现对隐藏信息的操作和访问。
在上面的User类中,我们把username和password两个属性都隐藏(private私有化,只能类的内部访问)起来了,你要给新的实例赋值,必须使用setUsername()和setPassword()方法,要取值,必须使用getUsername()和getPassword()方法。
为什么要这么做?我们先看一下小狗狗这个类。
class dog{
//下面是狗狗类的属性(假设只有这些)
String breed;
String color;
String name;
//下面是狗狗的一些行为,称之为类的方法
void eat()
{
}
void shout()
{
}
void waggingtail()
{
}
}
在上面小狗狗的类中,没有对属性进行修饰,默认就是公共(public)属性。因此我们在创建实例并且赋值的时候可以这么做。
dog a = new dog() ; //创建一个狗狗的实例,下面给各个属性赋值
a.breed=”东北虎”; //品种为东北虎,公共属性是允许直接通过 实例.属性名 赋值的
a.color=”色彩斑斓的黑”;//狗狗的颜色为色彩斑斓的黑
a.name=”你的名字”; //狗狗的名字为你的名字
你看吧,这样创建出来的狗狗,还是狗狗吗?
为了防止这种情况在我们的程序中出现,所以把属性进行私有化了。在User类中,通过 User b = new User(); 创建的实例b,因为其中的属性username和password都是私有的(private),因此直接使用b.username\b.password来赋值是非法(不被允许)的。但是在User这个类中还看不出来为什么要使用getUsername、SetUsername来进行取值和赋值操作。我们看下面这个例子。
Public class people
{
private String gender; //性别
public void setGenger(String g){
if("男".equals(g) || "女".equals(g)){
gender = g;
}else{
gender = "男";//赋予的其他值都默认为男
}
}
public String getGenger(){
if(这个用户设置了对他人隐藏性别){
return "你猜";
}else{
return gender;
}
}
当有一个人拿到这个类,并且进行实例化以后
people p = new people();
他无法直接对性别进行赋值 p.gender = “男”;因为gender 是私有的(private),因此也就不存在p.gender =”猪”; 的这种情况发生,他只能使用setGenger()函数对性别进行赋值,但是在setGenger()函数中,我们对传入的值进行了判定,非“男”即“女”,否则默认为“男”。因此就算他使用setGenger()函数传入了一个非法的值,我们也能够在函数中给与纠正。
p.setGenger(“人妖”);之后,p的gender 属性值为“男”。通过if…else…语句进行了纠正。
取值(getGenger())也是同样的道理,我们可以在getGenger()中去判定,假如这个用户不想要你看到他的性别,那我可以给你返回一个“你猜”。
4.类的特征之一:继承
还是用狗狗的类来说事儿吧。刚才我们定义了狗狗的类,他有品种、颜色、名字三个属性,能够摇尾巴、吃东西、叫唤,现在我有只猫,也有这三个属性,也能摇尾巴、吃东西、叫唤,但是我这只猫更厉害的是,它还会爬树。现在我要给我这只猫定义一个类,但是又比较懒,同时为了避免复制dog类被人说是CTRL CV程序员,怎么办呢?继承吧(一般不同的概念不做继承哈,这里为了举例而已。你可以定义一个猫科动物的类,然后在定义老虎这个类中继承父类,因为老虎本就属于猫科动物)。
那继承怎么写呢?如下:
class cat extends dog{ //通过extends继承了狗狗的所有属性、方法
void climb() //新加了一个爬树功能
{
}
}
好了一个继承(extends)就把狗狗的特征(属性)和能力(方法)都继承过来了,同时我还具备了爬树(climb)能力,这个时候,我们称狗狗类为父类、猫类为子类。父亲的特征和功能都遗传给了儿子同时儿子还具备了更强大的能力。三体人的遗传???
5.类的特征之一:多态
再次请出狗狗类和猫咪类。
class dog{
//下面是狗狗类的属性(假设只有这些)
String breed;
String color;
String name;
//下面是狗狗的一些行为,称之为类的方法
void eat()
{
}
void shout()
{
System.out.println("汪汪");//注意这里有了内容
}
void waggingtail()
{
}
}
上面这个狗狗类中,狗狗的叫唤声音被设定为“汪汪”了。
class cat extends dog{ //通过extends继承了狗狗的所有属性、方法
void climb() //新加了一个爬树功能
{
}
}
猫咪类继承了狗狗类的叫唤能力,但是显然猫咪不是这么叫的,咋办呢?重写父类的方法。
Class cat extends dog{ //通过extends继承了狗狗的所有属性、方法
Void climb() //新加了一个爬树功能
{
}
@Override
void shout()
{
System.out.println(“喵喵");
}
}
好了,猫咪终于能够“喵喵”叫了。重写就是类的多态的一种体现。