预定义类
预定义类就是由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)提高代码的复用性。