类三大特性 封装、继承、多态
程序员文章站
2022-05-18 23:26:17
类三大特性封装封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。从而更好地实现“高内聚、低耦合”思想。特点Java可以通过private、default、protected、public来修饰成员变量,从而实现外部程序访问成员变量权限private 修饰的成员变量不能被外部成员直接访问,通常需要调用get/set实现访问成员变量的效果public String getName(){ return this.nam...
类三大特性
封装
封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。从而更好地实现“高内聚、低耦合”思想。
特点
- Java可以通过private、default、protected、public来修饰成员变量,从而实现外部程序访问成员变量权限
- private 修饰的成员变量不能被外部成员直接访问,通常需要调用get/set实现访问成员变量的效果
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
封装的意义
- 提高程序的安全性
- 隐藏代码实现细节
- 统一接口
- 方便系统维护
继承
继承是类与类之间关系之一,通过extends关键字实现子类(派生类)继承父类(基类)效果。在Java语言中,所有的类默认直接或间接继承Object类。
super关键字
super关键字在继承关系类中常常使用到,是子类访问父类重要工具
父类
public class Person {
public String name = "这是父类";
}
子类
public class Student extends Person{
private String name = "这是子类";
public void print(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
测试类
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.print("这是测试类");
}
}
结果
- 可以清楚的看到,this指向的当前类成员变量,super指向的是父类成员变量,而未加this和super的name指向测试类传递的变量
父类
public class Person {
public String name ;
public Person(){
this.name = "这是父类";
}
}
子类
public class Student extends Person{
private String name ;
public Student(){
super();
this.name = "这是子类";
}
public void print(){
System.out.println(this.name);
System.out.println(super.name);
}
}
测试类
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.print();
}
}
结果
- 可以清楚的看到,我们通过测试类调用子类的构造器时,会先通过**super()**调用父类无参构造,注意super()必须放在构造函数首行,否则编译不能通过,且super()和this()不能同时出现在构造器中,原因两者都必须放在构造函数首行,否则编译不会通过,如下图
方法的重写
- 重写指的是方法的重写,与属性无关。方法的重写是子类对父类方法的重写,因为父类功能有时子类不一定需要或不一定满足子类
特点
- 方法的重写都是非静态方法,静态方法不存在重写。如:
父类
public class Person {
public static void print(){ //静态方法
System.out.println("这是父类");
}
}
子类
public class Student extends Person{
public static void print(){ //静态方法
System.out.println("这是子类");
}
}
测试类
public class Application {
public static void main(String[] args) {
Person student = new Student();
Student student1 = new Student();
student.print();
student1.print();
}
}
结果
- 可以看到两次调用print方法结果不同,取决于左边类变量类型,没有实现方法的重写,因此静态方法不存在重写
当我们将方法父子类方法都改为非静态方法后,结果是:
-
可以看到,子类已经方法已经重写重写父类方法,遵循向下转型
另外需要注意的是,子类重写方法修饰符和异常抛出范围可以缩小,但不能扩大
多态
- 特点:动态编译,可扩展性
public class Application {
public static void main(String[] args) {
Person s1 = new Student();
Person s2 = new Teacher();
Person s3 = new Person();
s1.print();
s2.print();
s3.print();
}
}
结果
-
可以看到对象左边实际类型都是确定的,即为父类Person类,但是指向的引用类型可以不同,可以随着程序的进行而进行确定,这就体现了多态的动态编译性。
-
父类可以指向子类,但是不能调用子类独有方法,而子类可以调用自己和继承类方法
子类
public class Student extends Person{
public void print() {
System.out.println("这是student");
}
public void say(){
System.out.println("学生说话了");
}
}
父类
public class Person {
public void print(){
System.out.println("这是父类");
}
}
测试类
public class Application {
public static void main(String[] args) {
Person s1 = new Student();
s1.print();
((Student) s1).say();
}
}
结果
- 可以看到当父类和子类用公共类时,同时引用类型指向子类方法,可以通过方法重写,调用子类方法,但是当方法为子类独有时,必须使用向下强转类将父类强转为子类,再调用子类独有方法。
本文地址:https://blog.csdn.net/weixin_45672377/article/details/109569732