访问类型 面向对象编程和面向过程编程 面向对象编程的特征

预定义类

预定义类就是由Java JDK给我们提供的一些类。

例如:当我们输入一个数组后,如果要对数据进行输出,使用到 " System.out.println(Arrays.toString(arr)) "该项代码时,其中的Arrays就是由JDK给我们提供的预定义类。

更改器方法和访问器方法

更改器方法和访问器方法在实际使用中运用较多。

数据访问类型

数据的访问类型一般有四种:public private default (表示空,也可以不写) protected

示例

// (一)
public class User{
    // public
    // private
    // 
    // protected
    
    private int age;
    public String name;
    char sex;
    protected String idCard;
}

对于不同的访问类型,我们需要知道它们所对应的有效范围是多少。

// (二)
//对于前面的代码,我们在同一个package下重新创建一个类 class
public class Test{
    public static void main(String[] args){
        User user = new User();
        user.idCard = "123";
        user.name = "张三";
        user.sex = '男';
        user.age = 18; //age无法被调用,在软件中会提示报错
    }
}

假设我们在User类下创建一个方法,并将Test类里的赋值内容添加到方法里,结果发现原本无法被获取的 age 也成功被获取掉并且赋值了。

// (三)
public class User{
    
    private int age;
    public String name;
    char sex;
    protected String idCard;

    void run(){
        User user = new User();
        user.idCard = "123";
        user.name = "张三";
        user.sex = '男';
        user.age = 18; //age可以被获取到,也可以被成功赋值
    }
}

Java访问修饰符的访问范围

当前类同包的类其他包的类子类
public
protected×
default×
private×××

当前类

如代码三所示,run方法和对变量的定义都放在了User这同一个类中,此时不管run方法是private类型还是其他类型,它的调用都不受影响。

即在当前类中,定义的类型的变量可以被当前类中任意的方法访问。只要是在同一个类中,无论是方法还是变量,无论是什么类型,都可以被调用。

同包的类

如代码一、二所示,Test类和User类是放在同一个package(包)下的两个类,它们就是同包的不同类

这样的两个同包不同类之间,我们经过测试知道 age 这个变量无法被调用,它的类型是private的,也就是说private类型只有在自己的类中才能被访问。

其他包的类

当我们在两个不同的package中创建两个不同的class时,我们发现 private protected default 三种类型无法被访问,只有public类型的能够成功对外访问。但是protected和default在一些极其特殊的情况下(一般不会用到)是可以被访问的。

子类

通过extends可以将一个类变成另一个类的子类,如果两个类不在同一个包下,此时数据能否被访问是按照“其他包的类”决定的,即private protected default 三种类型无法被访问。如果两个类放在同一个包下,此时在子类中的private类型的数据无法被访问。

// (四)
// 在与父类相同的package中创建一个class叫做People
// 加入extends关键字 这样People就变成了Users的子类
public class People extends User{
     User user = new User();
     user.idCard = "123";
     user.name = "张三";
     user.sex = '男';
     user.age = 18; //age无法被调用,在软件中会提示报错
}

Java面向对象

面向对象和面向过程

面向对象编程

假如我们定义一个类,首先需要将当前这个类使用new创建一个对象。创建出来之后在对象中存在相关的变量和方法,方法和变量可以统一称为数据,也就意味着把数据放在堆内存中。堆内存中有一块堆内存空间,这块空间其实就叫做对象。所以对象指的就是堆内存中的内存空间

如果外界要想对内存中的数据进行使用,就要让方法从对象中拿数据进行使用。所以面向对象编程指的就是方法从对象当中拿数据

在程序二中,当我们创建对象 user 的时候,我们使用User这个类里的内容作为创建对象的模板进行创建。再通过User创建对象user1时就会在堆内存中开辟新的空间储存user1的数据,这些数据都不是类里的数据,是对象里的数据,由于user和user1是两个对象,所以它们内部的数据彼此之间没有关系。

面向过程编程

Java的类是能创建对象的,类是创建对象的模板,调用的数据就是对象里的数据。而像C语言、C++这样的语言就是面向过程编程。面向过程语言不能创建对象,它们也有类的概念,但是它们的类创建不了对象,导致数据一直在类里面。当我们要使用数据时,就相当于是从类里调用数据,而这个数据是全局的数据。假如定义一个变量name,一个方法将它变成了张三,而另一个办法会把它又变成李四,每一个方法都可以对其进行改变,无法像面向对象那样分成不同的对象进行各自范围内的修改。

Java面向对象的基本特征

Java面向对象的基本特征分为:封装、继承、多态、接口(待定义)四个方面。

封装

封装本身是概念性的东西,实操性不如继承、多态、接口那么强。封装的本质就是将数据的实现形式对数据的访问者隐藏。隐藏的目的是为了安全性的设计。

封装的方式:如果想要对外隐藏数据,将数据全部变为private类型即可。

封装以后如果需要对数据进行访问,就得对外提供接口。对外提供一个Getter和Setter方法。

Setter是给当前这个变量进行赋值,而Getter是获取当前变量的值。

当提供了对外的接口,就可以通过接口实现从外部对数据进行访问,同时对数据的实际形式进行隐藏。

//(五)
//创建class User
public class User{
    private int age;
    private String name;
    private sex;
    private String idCard;
    //通过IDE的生成Getter和Setter指令创建接口
    public int getAge(){ //获取age的值的接口
        return age;    
    }
    public void setAge(int age){ //给age赋值的接口
        this.age = age;    
    }
    public String getName(){
        return name;    
    }
    public void setName(String name){
        this.name = name;    
    }
    public char getSex(){
        return sex;    
    }
    public void setSex(char sex){
        this.age = age;    
    }
    public String getIdCard(){
        return idCard;    
    }
    public void setIdCard(String idCard){
        this.idCard = idCard;    
    }
}
//-------------------------------------------------------
//创建class Test
public class Test{
    public static void main(String[]args){
        User user = new User();
        user.age = 18; //无法成功赋值
        user.setAge(18); //通过接口成功赋值给age
        int hhh = user.getAge(); //通过接口获得age的值储存在变量hhh中
        System.out.println(hhh); //输出hhh的值,即age的值
    }
}
封装的优点

(1)提高类的安全性(最重要的):我们所有的数据是需要对外进行保密的,封装可以将数据变成private类型,只能在类里进行访问和修改,避免外部程序直接访问和修改内部数据,只能通过getter和setter进行访问修改,从而保证类的安全性和保密性;

        同时,可以给getter和setter方法设置一些条件,以控制数据的修改,示例如下:

public void setAge(int age){
    if(age == 18){
        return; //当传给age的值是18时,无法进行更改        
    }
    this.age = age;    
}

(2)提高代码的可读性;

(3)提高代码的复用性。

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值