面向对象程序有三大特性:封装、继承和多态。封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
优点:
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起。更符合人类对事物的认知,而访问权限用来控制那些方法或者属性需要在类外直接使用。
范围 | private | default | protected | public |
---|---|---|---|---|
同一个包中的同一个类 | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
同一个包中的不同类 | 可以访问 | 可以访问 | 可以访问 | |
不同包中的子类 | 可以访问 | 可以访问 | ||
不同包中的非子类 | 可以访问 |
注: protected
主要用于继承中,default
是什么都不写时的默认权限。
访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。一般情况下成员变量设置为private
,成员方法设置为public
。
class Dog{
//狗的属性
private String name;//狗的名字
public String color;//狗的颜色
public String sex;//狗的性别
String breed;//狗的品种
public Dog(String name, String color, String sex, String breed){
this.breed = breed;
this.color = color;
this.name = name;
this.sex = sex;
}
//狗的行为
public void run() {
System.out.println("奔跑ing");
}
public void wag(){
System.out.println("摇尾巴ing");
}
}
public class Main{
public static void main(String[] args) {
Dog dog1 = new Dog("大白","金黄色","公狗","萨摩耶"); //通过new实例化对象
//System.out.println(dog1.name);//会报错,因为name是私有的成员变量,只能在Dog类中被访问
System.out.println(dog1.sex); //public属性,公有成员变量可以被其他类访问
System.out.println(dog1.breed); //default属性,默认成员变量只能被当前包中的类访问
dog1.run();
dog1.wag();
}
}
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
包的作用
包名需要尽量指定成唯一的名字,通常使用互联网域名的颠倒形式来作为它的包名。包中的每一个部分对应一个子目录。
示例:com.csdn.test
的包,包里包含了一个Test.java
文件
包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
示例:以下代码就被放在一个叫做testcode
的包中。命名通常使用小写,避免冲突。
package testcode;
import java.util.*;
public class Test {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.getTime());
}
}
例如Date类:可以使用java.util.Date
导入java.util
这个包中的Date
类。
使用import导入
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
也可使用以下方式导入
public class Test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
使用这个包中的其他类,可以使用一种简便的导入方式import java.util.*
但是一般建议明确指出要导入的类名,否则可能会导致冲突。
import java.util.*;
import java.sql.*;
public class Test {
public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
Date date = new Date();
System.out.println(date.getTime());
}
}
下面将举个例子来介绍下访问控制权限。
示例:创建包package com.csdn.animal1
和package com.csdn.animal2
,Dog.java
放在animal1
中,TestDog.java
放在animal2
中。
//Dog.java
package com.csdn.animal1;
public class Dog{
//狗的属性
private String name;//狗的名字
public String color;//狗的颜色
public String sex;//狗的性别
String breed;//狗的品种
public Dog(String name, String color, String sex, String breed){
this.breed = breed;
this.color = color;
this.name = name;
this.sex = sex;
}
//狗的行为
public void run() {
System.out.println("奔跑ing");
}
public void wag(){
System.out.println("摇尾巴ing");
}
}
//TestDog.java
package com.csdn.animal2;
import com.csdn.animal1.*;
public class TestDog {
public static void main(String[] args) {
Dog dog = new Dog("大黄", "金黄色", "公狗", "萨摩耶"); //通过new实例化对象
System.out.println(dog.color); //正常运行,public属性,公有成员变量可以被其他类访问
//System.out.println(dog.name);//报错,私有变量,不允许被其他类访问
//System.out.println(dog.breed); //报错,不允许被其他包中的类访问
dog.run();
dog.wag();
}
}