时隔一周,小的终于学完面向对象了。接下来给各位观众老爷一起分享学习,如有错误遗漏之处请多指教!
开篇先抛出一个问题:大家知道Java面向对象的三大基本特征吗?可能有观众老爷会说,这简单啊 !封装、继承、多态。那再接着问,什么是封装、继承、多态呢?别着急,请听我细细道来...
一、封装
封装就是把过程和数据包围起来,对数据的访问只能通过已定义的接口。
原则:
- 将类的某些信息隐藏在类内部,不允许外部程序直接访问
- 通过该类提供的方法来实现对隐藏信息的操作和访问
好处:
- 提高代码的安全性
- 把代码用方法进行封装,提高了代码的复用性
1.1 private关键字
3.作用是保护成员不被别的类使用,被private修饰的成员只在本类中才能访问
注意:针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
-
提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
-
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
关键字使用:
- 把成员变量用private修饰
- 提供对应的getXxx()/setXxx()方法
例如: 创建一个学生类
public class Student {
private String name; //姓名
private String sex;// 性别
private int age; //年龄
/*提供对应的getXxx()/setXxx方法
按住ALT+insert键 选中Getter and Setter
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
如上代码,一个标准的学生类就创建好了。
1.2 this关键字
在上述代码中我们可以看见在set()方法中有一个this,这个this在Java中也是一个关键字。
那么什么时候使用this关键字呢?
解决局部变量隐藏成员变量
我们在代码中可以看到,在这个学生类中有成员变量name,在提供的成员方法中也有一个局部变量name,那么显然成员变量与局部变量重名了。那么在我们调用setXxx()方法时,就需要一个this关键字来指向我们的成员变量,这样才能把值赋给我们的成员变量。
大家可以自己动手试一试,例如把上面的学生类中的setSex()方法中的this.sex = sex;改成sex = sex;然后在测试类中进行操作打印,看控制台输出的结果是怎样的?
二、继承
面向对象三大特征之一
使子类有了父类的属性与方法,也可以在子类中重新定义以及追加属性和方法
优点:
- 继承可以让类与类之间产生关系,子父类关系产生子父类后,子类则可以使用父类中非私有的成员。
- 提高代码复用性和维护性
缺点:
- 类的耦合性增强了,削弱了子类的独立性
2.1 extends关键字
格式:class 子类 extends 父类{}
例如:
创建父类:
public class A {
int a = 1;
double d = 2.0;
public void show(){
System.out.println("Class A: a=" + a + "\td=" + d);
}
}
创建类B使用extends关键字继承类A,成为类A的子类
public class B extends A {
float a = 3.0f;
String d = "Java program.";
public void show() {
System.out.println("Class B: a=" + a + "\td=" + d);
}
}
上述代码就是一个简单的继承。
接下来说明一下继承中访问变量的特点:采用的是就近原则。
解释一下:
- 子类局部范围找
- 子类成员范围找
- 父类局部范围找
- 父类成员范围找
- 如果都找不到就报错
我们来测试一下: 依旧是上面的例子
我们创建一个测试类:
public class Test {
public static void main(String[] args) {
A a = new A(); //创建父对象
a.show();
B b = new B(); //创建子对象
b.show();
}
}
点击运行查看测试结果:
我们可以看出子对象输出的结果是Class B: a=3.0 d=Java program.再回到子类的代码中
public class B extends A {
float a = 3.0f;
String d = "Java program.";
public void show() {
System.out.println("Class B: a=" + a + "\td=" + d);
}
}
我们可以看到B类虽然继承了A类,但是在访问变量时,仍是先访问的子类范围内的成员变量以及方法。
2.2 super关键字
super:代表父类存储空间的标识(可以理解为父类对象引用)
前面我们学习了this关键字,在这里我们说明一下区别:
成员变量:
this.成员变量 - 访问本类成员变量
super.成员变量 - 访问父类成员变量
成员方法:
this.成员方法 - 访问本类成员方法
super.成员方法 - 访问父类成员方法
构造方法:
this(…) - 访问本类构造方法
super(…) - 访问父类构造方法
接下来看如何使用:
依旧是之前的A和B类,但是这次我们在B类的show()方法中加入一句super.show();
public class B extends A {
float a = 3.0f;
String d = "Java program.";
public void show() {
super.show();
System.out.println("Class B: a=" + a + "\td=" + d);
}
}
点击运行,控制台输出:
这次我们可以看到控制台多打印了一次Class A: a=1 d=2.0 这正是super的作用,访问父类中的成员方法。
2.3 方法重写
重写概念:子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
应用场景:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
Override注解:用来检测当前的方法,是否是重写的方法,起到【校验】的作用
注意事项:
- 私有方法不能被重写(父类私有成员子类是不能继承的
- 子类方法访问权限不能更低(public > 默认 > 私有)
2.4 继承注意事项
- Java中类只支持单继承,不支持多继承、
- Java中类支持多层继承
三、多态
多态: 同一个对象,在不同时刻表现出来的不同形态
前提条件:
要有继承/实现关系
要有方法重写
要有父类引用指向子类对象
3.1 访问特点
多态中成员变量的访问特点是什么
编译看左边、运行看左边
多态中成员方法的访问特点是什么
编译看左边、运行看右边
3.2 多态的优劣性、
优点:
提高了代码的扩展性。
定义方法时,如果将父类型作为参数,在使用方法时,可以传递任意子类对象
弊端:
不能使用子类特有的成员
3.3 多态中的转型
父类引用指向子类对象其实就是向上转型。例如:
Animal a = new Dog();
将父类型的引用转换成具体的子类对象。转换格式:
子类 对象名 = (子类)父类引用;
以上就是我今天分享的内容,如有错误遗漏之处请多指出!