0
点赞
收藏
分享

微信扫一扫

Java面向对象三大特性

Ichjns 2022-04-17 阅读 85
java

封装(数据的隐藏)

我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外
部干涉;低耦合:仅暴露少量的方法给外部使用。
在定义一个对象的特性的时候,有必要决定这些特性的可见性,即哪些特性对外部是可见的,哪些特性
用于表示内部状态。
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
属性私有 get/set
属性私有示例

package opp.demo01;
//学生类
public class Student {
    //属性:字段
    //名字
    private String name;
    //学号
    private int id;
    //性别
    private char sex;


    //方法
    public void study(){
        System.out.println(this.name+"学生在学习");
    }
}

在这里插入图片描述

使用private将其属性私有化,然后实例化Student对象是不能直接修改调用name,会提示这个name属性在Student中私有
get/set示例
提供一下可以操作这个属性的方法
get 获得这个属性
在这里插入图片描述
在Student类中提供一个get方法可以获得这个属性

set 给这个属性设置值
在这里插入图片描述
在idea中使用alt+insert键可以自动生成get和set方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们还可以对set方法做一些操作,比如说人的年龄,如果不加以限制,可以输入负数或者999999,这些都是不现实的,就可以在set方法中写

 public void setAge(int age) {

        if(age>130||age<0){
            System.out.println("年龄不合规");
        }else{
            this.age = age;
        }

    }

在这里插入图片描述

封装的步骤

1.使用private 修饰需要封装的成员变量。
2.生成get/set方法

作用和意义

  1. 提高程序的安全性,保护数据。
  2. 隐藏代码的实现细节
  3. 统一用户的调用接口
  4. 提高系统的可维护性
  5. 便于调用者调用。
    良好的封装,便于修改内部代码,提高可维护性。
    良好的封装,可进行数据完整性检测,保证数据的有效性。

this关键字

区别成员变量和局部变量

public class Student{
private String name;
public void setName(String name){
//this.name表示类中的属性name
//name 代表传入的参数
this.name = name;
}
}

调用类中的其他方法

public class Student{
private String name;
public void setName(String name){
this.name = name;
}
public void print(){
//表示调用当前类中的setName方法
this.setName("wx");
//setName("wx");
}
}

认情况下,setName(“wx”)和this.setName(“wx”)的效果是一样的.
调用类中的其他构造器

public class Student{
private String name;
public Student(){
//调用一个参数的构造器,并且参数的类型是String
this("wx");
}
public Student(String name){
this.name = name;
}
}

this的这种用法,只能在构造器中使用.普通的方法是不能用的.并且这局调用的代码只能出现在构造器中的第一句.

继承

继承就好比是哺乳动物、爬行动物他们都是动物,具有动物的一些特性,但并不是全部特性,这些特性对于哺乳动物和爬行动物也不一定一样。
为什么需要继承?继承的作用?
第一好处:继承的本质在于抽象。类是对对象的抽象,继承是对某一批类的抽象。
第二好处:为了提高代码的复用性。
extands的意思是“扩展”。子类是父类的扩展。
【注】JAVA中类只有单继承,没有多继承! 接口可以多继承!
继承的写法

public class Student extends Person{//使用extends关键字
//student类继承了person类
}

注:一个子类只能直接继承一个父类,一个父类可以被多个子类继承
父类中的属性和方法可以被子类继承
示例
在这里插入图片描述
在Person中定义了一个say方法,使用Student继承了Person类,然后实例化Student类,就可以直接调用say方法
在这里插入图片描述

在Person中定义了一个money属性,使用Student继承了Person类,然后实例化Student类,就可以直接调用money属性
这里都使用了public修饰符修饰,如果使用private私有的修饰,将无法被调用。如果需要调用,就要使用到封装,然后使用get方法调用
在这里插入图片描述

Object类

java中的每一个类都是"直接" 或者 "间接"的继承了Object类.

super关键字

子类继承父类之后,在子类中可以使用this来表示访问或调用子类中的属性或方法,使用super就表示访问或调用父类中的属性和方法。
访问父类中的属性
在这里插入图片描述

使用this调用name作用在Student类中,使用super调用name作用在Person中
调用父类中的方法
在这里插入图片描述
调用父类的构造器
在这里插入图片描述
Student中没有调用父类的无参构造,但是父类中的无参构造执行了而且是先执行的,那是因为在子类的无参构造中隐藏了一句super();
他会默认调用父类的无参构造

public Person() {
		//super();
        System.out.println("Person无参构造执行");
    }

调用父类的构造器必须在子类构造器的第一行,否则会报错,这就是为什么上面那个代码父类构造器先执行的原因,如果需要调用自己的构造器,this也需要放在第一行。
在这里插入图片描述
当父类定义了一个有参构造,默认的无参构造失效时,子类写无参构造必须手动调用父类的有参构造,否则会报错。
使用super的注意点

  1. 用super调用父类构造方法,必须是构造方法中的第一个语句。
  2. super只能出现在子类的方法或者构造方法中。
  3. super 和 this 不能够同时调用构造方法。(因为this也是在构造方法的第一个语句)

super与this的区别

  1. 对象不同
    this:代表所属方法的调用者对象。
    super:代表父类对象的引用空间。
  2. 使用前提不同
    this:在非继承的条件下也可以使用。
    super:只能在继承的条件下才能使用。
  3. 调用构造方法:
    this:调用本类的构造方法。
    super:调用的父类的构造方法

方法重写

  1. 方法重写只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不
    能被重写.

静态方法不能重写
2. 父类的静态方法不能被子类重写为非静态方法 //编译出错
3. 父类的非静态方法不能被子类重写为静态方法;//编译出错
4. 子类可以定义与父类的静态方法同名的静态方法(但是这个不是覆盖)
在这里插入图片描述

在这里插入图片描述

Person p = new Student();//父类的引用指向子类

两张图有明显的区别,就是第二个调用的方法一个调用的是父类的方法,一个是调用了子类的方法,第二个就是子类重写了父类的方法
@Overrides 功能注解,在idea中可以直接使用Ctrl+o来选择重写父类的哪些方法,只有非静态的方法才能重写,私有的方法也不能够重写
在这里插入图片描述

为什么要重写
子类继承父类,继承了父类中的方法,但是父类中的方法并不一定能满足子类中的功能需要,所以子类中需要把方法进行重写
总结及注意点

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 访问控制修饰符可以被扩大,但是不能被缩小: public> protected> default >private
  4. 抛出异常类型的范围可以被缩小,但是不能被扩大
    ClassNotFoundException —> Exception
  5. 返回类型可以相同,也可以不同,如果不同的话,子类重写后的方法返回类型必须是父类方法返回类型的子类型
    例如:父类方法的返回类型是Person,子类重写后的返回类可以是Person也可以是Person的子类型
  6. static方法不能被重写,因为被static修饰的方法是属于类的,而不是属于实例的
  7. final方法不能被重写,因为被final修饰的方法无法被子类重写
  8. private方法和protected方法,前者是因为被private修饰的方法对子类不可见,后者是因为尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,一个不能被外部引用的方法,没必要重写
    注:一般情况下,重写的方法会和父类中的方法的声明完全保持一致,只有方法体不同。

多态

什么叫多态:一个对象具备多种形态,也可以理解为事物存在的多种体现形态
一个对象的实际类型是确定的,可以指向这个对象的引用类型是不确定的,父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象

Student s =new Student();
Person p = new Student();

在这里插入图片描述
在这里,子类可以重写父类的方法,当子类的引用对象指向自己时,可以调用自己独有的方法和继承父类的方法(如果子类重写了父类的方法就调用重写的,如果没有重写就调用父类原有的),而当子类的引用对象指向父类时,只能调用子类重写父类的方法或者调用从父类那继承来的方法,不能调用子类独有的方法,如果非要调用的花,需要进类型转换。

多态的注意事项

  1. 多态是方法的多态,属性没有多态性。
  2. 编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通不过编译器的检查。但是如果两个没有关联的类进行强制转换,会报:ClassCastException。
  3. 多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象
举报

相关推荐

0 条评论