记得在学习Java之初的时候第一个概念就是Java的概念和他的特征,现在在写一篇博客来浅谈一下我自己的理解。
那么在Java中,我们开始都学习了Java的三个特征,那么就是封装,继承,多态。
那么为什么他们能作为Java中的三个特点,他们怎么用,对于刚学习Java的同学可能也比较疑惑。那么在这我来说说我对三大特征的一个理解。
首先来谈一下封装,简单的来说封装就是来保护数据的,这个过程就像是,出发一个目的地,路有很多条,但是每一条都不一样,路的宽窄长短不同,假设有条路的宽窄只能自行车电动车才能通过,这时候你非要想开大汽车走过的话是不可能的。在Java里对一个类封装后,我们通过代码来向类里存放数据时,如果你的数据不满足类已经定义好的规则的话,是实现不了的。在封装中,类的变量将从其他类隐藏,并且只能通过当前类的方法访问(getter,setter方法)。 因此,它也被称为数据隐藏。来个小案例爽一下
我们先来创建一个类,并定义属性和方法,注意每个属性定义的前面要加入private(私有的),将属性私有化,不加修饰符封装就毫无意义了
//学生类
public class Student {
private String name ; //学生姓名
private int age ; //学生年龄
private String sex ; //学生性别
private int stuId ; //学生学号
//通过getter方法获取类中的属性
//通过setter方法设置类中的属性
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
//toString方法用来打印出类的属性
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", stuId=" + stuId +
'}';
}
}
有个小需求,学号只能是九位数,如果不满足九位数那么这个数据是失效的,这个时候我们可以在学号的setter方法里设置一下数据的判断
public void setStuId(int stuId) {
//将参数stuId转化成字符串
String stuIdNew = stuId+"";
//判断字符串的个数是否满足九位,如果满足传入值成功
if (stuIdNew.length()==9){
this.stuId=stuId;
}
}
继承
就是子类继承父类的特征和行为,子类从父类继承方法和属性,使得子类具有父类相同的行为。
这句话就理解为孩子继承父母所有的财产相似,但是Java里的继承是连带属性和方法都继承了,构造方法除外
语法:
访问修饰符 class 子类名 extends 父类名
例如:
public class Teather extends Student{
}
虽然我们这里没有定义方法和类的代码,但是Teacher类中有从Student类中继承过来的方法和属性,
如图,我们在实例化类的对象之后,可以看到里面有从父类继承过来的属性和方法、
多态
是同一个行为具有多个不同表现形式或形态的能力。
满足多态的条件:
1.在继承关系中
2.方法的重写
3.父类引用指向子类对象 (父类类型 变量名=new 子类类型())
方法的重写简单来说就是不用父类的方法,自己重新定义方法覆盖父类方法并使用自己的方法
例如,我在父类Student类中加入
public void can(){
System.out.println("我是学生");
}
在子类Teacher中添加方法
public void can(){
System.out.println("我是老师");
}
当我实例化对象的时候会显示的是"我是老师",如果没有定义方法的话默认还是会使用父类的方法
父类引用指向子类对象
还有一种写法是
Student student = new Teather();
父类句柄可以接收子类对象,在调用 can()方法时,传递的都是 Student类的对象,但是输出什么样的结果取决于该父类句柄所绑定(指向)的到底是什么对象,这就是多态性的外在体现。