- 面向对象程序三大特性:封装、继承、多态。
- 在类和对象阶段,主要研究:封装。
- 什么是封装?——套壳屏蔽细节
eg. 电脑提供给用户的是:开关机、通过键盘输入,显示器,usb插孔等等,让用户和计算机进行交互完成日常事务。但是实际上,电脑真正工作的是CPU、显卡、内存等一些硬件软件。
对于用户而言,不用关系计算机的内部核心结果,只要知道怎么开关机、怎么通过键盘和鼠标与计算机进行交互就可以。
因此,计算机在出厂时,厂商在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标等,使用户可以和计算机进行交互即可。 - 封装:将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。【把类的实现细节进行隐藏,对外只提供交互的接口】
- Java访问修饰限定符【4类:private、default默认权限、protected、public】
Java中主要通过类和访问权限来实现封装:类可以将数据和封装数据的方法结合在一起,访问权限可以控制方法或者字段能否直接在类外使用。 - 封装扩展——包
什么是包?为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
eg. 为了更好的管理歌曲,可以将相同属性的歌曲放在相同的文件夹下,并且在此文件下还可以按歌手进行进一步分类。
包:将Java代码更好归类归整,不让代码太乱。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如一个包中的类不想被其他包中的类使用。
在同一个工程中允许存在相同名称的类,只要处在不同的包中就可。
- 导入包中的类——import
冗余的写法:java.util.Date date = new java.util.Date();
public class Test1 {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
//得到一个毫秒级的时间戳
System.out.println(date.getTime());
}
}
使用improt语句导入包中的类的写法import java.util.Date; Date date = new Date();
import java.util.Date;
public class Test1 {
public static void main(String[] args) {
// java.util.Date date = new java.util.Date();
Date date = new Date();
//得到一个毫秒级的时间戳
System.out.println(date.getTime());
}
}
如果需要使用java.util中的其他类,可以使用import java.util.*
,这里不是把util包里面所有的类都导进来,而是随用随取,用到哪个类,就会导哪个类(与C语言不同,C语言include是把头文件的所有内容都导进来)
- 使用*导入,可能会引起歧义,因为不同包的类名可以相同,在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
import java.util.*;
import java.sql.*;
public class Test1 {
public static void main(String[] args) {
Date date = new Date();
//得到一个毫秒级的时间戳
System.out.println(date.getTime());
}
}
报错提示:
分析:util和sql中都存在Date这样的类,此时就会出现歧义,编译出错。
在这种情况下需要使用完整的类名。 java.util.Date date = new java.util.Date();
import java.util.*;
import java.sql.*;
public class Test1 {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
//得到一个毫秒级的时间戳
System.out.println(date.getTime());
}
}
-
自定义包——操作步骤
①在IDEA中先新建一个包:src是Java默认的包,src就是这个文件夹下有很多.java文件
②在弹出的框中输入包名:包名需要尽量指定成唯一的名字,通常会使用公司的域名的颠倒形式(例如:www.shuai.com的颠倒形式:com.shuai.www),包名要和代码路径相匹配,例如创建com.shuai.www的包,那么会存在对应的com/shuai/www来存储代码【对应3个文件夹】
③在包中创建类:在文件的最上方加上一个package语句,指定该代码在哪个包中,目的是为了声明当前类在哪个包底下
④此时磁盘上的目录结构已经被IDEA自动创建出来了
-
验证:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
如图所示,www和www2为两个不同的包,里面都有相同名称的Test类 -
关于访问修饰限定符的验证
①被private修饰,只能类内自己使用,类外不能使用。
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(this.name + "吃饭");
}
}
public class Test2 {
public static void main(String[] args) {
Person person = new Person("小王",22);
System.out.println(person.name);
}
}
运行结果:
分析:因为成员变量String name是private权限,只能在Person类中使用,不能在Test2类中使用。
如何证明在Person类中可以使用?调用eat方法,因为eat方法中用到了成员变量name。
public void eat() {
System.out.println(this.name + "吃饭");
}
}
public class Test2 {
public static void main(String[] args) {
Person person = new Person("小王",22);
person.eat();
}
}
运行结果:
因此,private只能在当前类中使用,即同一包中的同一类
②默认权限default
验证default只能在同一个包中使用,也叫包访问权限
在com.shuai.www包下的Person类中:
package com.shuai.www;
public class Person {
String name;
int age;
public void eat() {
System.out.println(name + "吃饭");
}
public static void main(String[] args) {
Person person = new Person();
person.name = "小王";
}
}
在com.shuai.www2包下的TestPerson类中:
package com.shuai.www2;
import com.shuai.www.Person;
public class TestPerson {
public static void main(String[] args) {
Person person = new Person();
person.name = "小王";
}
}
可以发现在com.shuai.www2包下的TestPerson类出现报错:
综上,默认权限的成员变量只能在同一个包内访问。
③protected权限的变量在继承中学习
④pbulic权限:可以理解为一个人的外貌特征,谁都可以看到,可以任何其他类访问
-
常见的包
①java.lang:系统常用基础类(String、Object),此包从jdk1.1后会自动导入
②java.lang.reflect:java反射编程包
③java.net:网络编程开发包
④java.sql:数据库开发的支持包
⑤java.util:java提供的工具程序包(集合类等),非常重要
⑥java.io:I/O编程开发包 -
get和set方法
随着程序的运行,想要修改对象的成员变量,因为构造方法只能执行一次,因此提供公开的getheset方法来修改私有的成员变量。
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat() {
System.out.println(name + "eat");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.setName("小王");
System.out.println(person.getName());
}
}
运行结果:
分析:在Person类中将成员变量name设置私有权限,则只能在Person类中访问,则在Test类中要想访问name成员变量,可以使用setName和getName方法。