目录
java封装类及类的使用
封装的概念
封装,简单来说,即将东西包在一起,然后以新的完整形式呈现出来。详细一点讲,即将方法和字段一起包装到一个单元中,单元以类的形式实现。
这里我们提到一个概念:信息隐藏,即通过封装,函数体被隐藏,只提供函数API的接口,通过隐藏对象的实现细节,不让外部直接访问或修改。这和封装这一特性密切相关。
将数据和方法包装进类中,加上具体实现的隐藏(访问修饰符),共同被称作封装,其结果是一个同时带有特征和行为的数据类型。
“定义类,定义其属性、方法的过程称为封装类”
封装类并且使用类:
class Student
{
private int age; //定义类的属性
String name;
double score;
private int sex;
void introduce() //定义类的方法,方法 = 函数
{
System.out.println("name="+name+",age="+age+",score="+score);
}
void testFunc()
{
System.out.println("testFunc");
}
}
public class Demo1 {
public static void main(String[] args) {
Student stu1 = new Student(); //实例化一个对象
//类=模板
//类不能直接使用,不能直接访问变量,需要先实例化,申请一个空间
stu1.age = 18; //给对象的属性进行赋值
stu1.name = "yangchenyang";
stu1.score = 98.5;
stu1.introduce(); //调用对象的方法
}
}
Java封装之访问修饰符
为什么用访问修饰符
说到访问修饰符,就要提到信息隐藏。
信息隐藏是最重要的功能之一,也是使用访问修饰符的原因,其包括:
- 对模块的任何实现细节所作的更改不会影响使用该模块的代码。
- 防止用户意外修改数据。
- 使模块易于维护和使用。
Java中的四种访问修饰符:
public(公共的)
protected(受保护的)
default(默认的)
private(私有的)
访问权限介绍
public 可以被所有其他类所访问。
protected 本类,同一个包中类及子类可以访问。
default 本类,同一个包内的类可以访问。
private 只能被本类访问和修改。
表格总结
访问修饰符的目的就是规范变量、方法、类的使用空间,
注意:Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。
访问修饰符封装属性和方法
属性封装的实现
当我们将属性修改为private的时候,我们就限制了其他类对本类属性的访问,这时候我们就需要为每个属性创建一对赋值方法(setter)和取值方法(getter)方法,用于公开这些属性的访问接口。
方法封装的目的
隐藏方法的实现细节(方法体),向外部提供公开的接口(方法头),以供安全简化调用,方便修改维护,根据需要可以私有化方法,以供内部使用。
属性封装和方法封装。
具体代码实现如下:
class Student
{
private int age; //定义类的属性
String name;
double score;
private int sex;
private void myage(int myage) //私有化方法,以供内部调用
{
age = myage;
}
public void setage(int realage) //赋值方法
{
age = realage;
}
public int getage() //取值方法
{
myage(18); //内部调用私有化方法
return age;
}
public void setsex(int finalsex) //赋值方法
{
sex = finalsex;
}
public int getsex() //取值方法
{
return sex;
}
void introduce() //定义类的方法,方法 = 函数
{
System.out.println("name="+name+",age="+age+",score="+score);
}
void testFunc()
{
System.out.println("testFunc");
}
}
public class Demo1 {
public static void main(String[] args) {
Student stu1 = new Student(); //实例化一个对象
//stu1.age = 18; //给对象的属性进行赋值
stu1.setage(36);
stu1.name = "yangchenyang";
stu1.score = 98.5;
stu1.introduce(); //调用对象的方法
stu1.setsex(10); //对属性赋值
System.out.println("sex="+stu1.getsex()); //对属性取值
System.out.println("age="+stu1.getage()); //对属性取值
}
}
Java封装之构造方法
UML类图
统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。
类的命名尽量应用领域中的数据,应明确、无歧义,以利于相互交流和理解。类的属性、操作中的可见性使用+、#、-分别表示public,protected和private。
构造方法的概念和作用
- 构造方法负责对象的初始化工作,为对象的属性赋合适的初始值。
- 创建对象时,其类的构造方法确保再用户操作对象前,系统保证初始化的进行(
构造方法再类被实例化的时候就被调用了
)
构造方法的语法规则
- 构造方法名与类名一致
- 没有返回类型
- 方式实现主要为字段赋初值
构造方法的调用
构造方法的调用很特别:new操作符(实例化对象的时候,自动被调用)
Java系统保证每个类都有构造方法
编程实现
class Student
{
private int age;
String name;
double score;
Student(){ //如果一个类没有写构造方法,系统回为之自动加上构造方法,参数为无参
}
Student(int newage, String newname, double newscore){ //构造方法可重载
System.out.println("构造方法一被调用");
age = newage;
name = newname;
score = newscore;
}
Student(int newage, String newname){ //构造方法可重载
System.out.println("构造方法二被调用");
age = newage;
name = newname;
}
Student(int newage){
System.out.println("构造方法三被调用"); //构造方法可重载
age = newage;
}
}
public class Test {
public static void main(String[] args) {
Student stu1 = new Student(18, "yangchenyang", 98.5);
Student stu2 = new Student(18, "yangchenyang");
Student stu3 = new Student(18);
}
}
以上代码,我们自己实现了构造方法的重载。关于重载:
- java语言中,方法可以重载
- 重载后的方法名相同,参数列表不同
- 参数列表包括参数的名称、个数和顺序等。
- C语言不允许方法的重载。
Java封装之this关键字
this关键字的特点
- 在类的方法中,使用this关键字代表的是调用此方法的对象的引用。
class Student
{
private int age;
String name;
double score;
Student(int newage, String newname, double newscore){ //构造方法可重载
System.out.println("构造方法被调用");
age = newage;
name = newname;
score = newscore;
}
void testThis(){
System.out.println(this.name); //这里的this表示实例化后的对象
}
}
public class Test {
public static void main(String[] args) {
Student stu1 = new Student(18, "yangchenyang", 98.5);
stu1.testThis();
}
}
- this可以看作是一个变量,它的值是当前对象的引用。
class Student
{
private int age;
String name;
double score;
Student(int newage, String newname, double newscore){ //构造方法可重载
System.out.println("构造方法被调用");
age = newage;
name = newname;
score = newscore;
}
void testThis(){
Student stutemp = null;
stutemp = this; //在这里this被看作一个变量,stutemp被赋值为stu1
System.out.println(stutemp.age);
System.out.println(this.name); //这里的this表示实例化后的对象
}
}
public class Test {
public static void main(String[] args) {
Student stu1 = new Student(18, "yangchenyang", 98.5);
stu1.testThis();
}
}
- 使用this可以处理方法中的成员变量和形参同名的问题。(常用,解决二义性)
Student(int age, String name, double score){ //构造方法可重载
System.out.println("构造方法被调用");
this.age = age;
this.name = name;
this.score = score;
}
- 当在方法内需要用到调用到该方法的对象时,就可以用this。
同第1点
- 在类的构造方法中可以调用this([参数列表])来调用该类的指定构造方法。
class Student
{
private int age;
String name;
double score;
Student(){ //如果一个类没有写构造方法,系统回为之自动加上构造方法,参数为无参
System.out.println("无参构造方法被调用");
}
Student(int newage, String newname, double newscore){ //构造方法可重载
System.out.println("构造方法一被调用");
age = newage;
name = newname;
score = newscore;
}
Student(int newage, String newname){ //构造方法可重载
System.out.println("构造方法二被调用");
age = newage;
name = newname;
}
Student(int newage){
//this();
this(18, "yangchenyang", 98.5); //只能调用一个构造方法
//this(18, "yangchenyang");
System.out.println("构造方法三被调用"); //构造方法可重载
age = newage;
}
}
public class Test {
public static void main(String[] args) {
Student stu3 = new Student(18);
}
}
Java封装之static关键字
static关键字的特点
- 用来修饰类的成员——修饰的成员变量的称为类变量(静态变量)
- 修饰成员方法称之为类方法(静方法)
- 当类被加载的时候就会被加载,优先于对象的存在
- 用来修饰的语句块被称为静态代码块,先于构造方法之前执行,只会执行一次,用来对静态成员做初始化
- 调用的时候可以直接通过类名.成员来访问
测试实例:
class Student
{
private int age;
String name;
double score;
static int data;
Student(int age, String name, double score){ //构造方法可重载
System.out.println("构造方法");
this.age = age;
this.name = name;
this.score = score;
}
static{
System.out.println("静态代码块,构造方法之前执行,只执行一次");
}
void introduce(){
System.out.println("name="+name+",age="+age+",score="+score);
}
}
public class Test {
static int add(int a,int b){ //想要直接访问,必须加上static,否则就实例化对象,用对象名访问
return a + b;
}
public static void main(String[] args) {
Student stu1 = new Student(18, "yangchenyang", 98.5);
Student stu2 = new Student(16, "lihua", 98.3);
stu1.score = 10; //非静态变量,必须实例化后用对象名访问
Student.data = 10; //静态变量,直接用类名访问,优先于对象存在
System.out.println("ret="+add(1,3));
}
}
static关键字的注意事项
- 静态方法只能访问外部的静态成员
- 静态方法中不能出现this关键字(this的是对对象的引用,而静态方法是先于对象存在的)
方法的重载
多数程序设计语言要求为每个方法(函数) 提供一个独一无二的方法名,不存在方法重载的概念,在java中,规定方法签名是解析方法的规则而不是方法名,为方法重载开创了条件。方法重载使得在一个类中,方法名相同而参数列表不同的方法可同时存在,代表相似的行为或功能。
重载overload的概念:同一个类中,同名不同参的方法称为重载方法
注意:仅有返回值不同的方法不能称为重载
方法重载并不陌生,Java.io.PrintStream类的println方法能打印数据,根据数据类型不同,有不同的实现方式:
public class Demo01PrintStream {
public static void main(String[] args) throws FileNotFoundException {
//创建打印流PrintStream对象,构造方法中绑定要输出的目的地
PrintStream ps = new PrintStream("day10_IO\\print.txt");
//如果使用继承自父类的的方法write写数据,那么查看数据的时候会查询编码表97-->a
ps.write(97);
//如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97-->97
ps.println(97);
ps.println('a');
ps.println("Hello");
ps.println(true);
}
}
Java封装之包
打包的意义:
- 标准java库是由一系列包组成,包括java.lang、java.util、java.net等等
- 标准java包就是层次型包结构,就如同硬盘上嵌套的子目录一样,我们可以使用嵌套层次结构来组织包
- Java的包是为了更好地规划代码,防止命名冲突和混乱。所以java出现了打包机制。
- 当把类组织起来放进一个包内之时,也就给包中的成员赋予了相互访问的权限,您就拥有了该包内的程序代码
- 包访问权限把类聚集在一个包中这一做法提供了意义和理由
Pacage——声明包
- Java程序猿都可以编写属于自己的Java包,为了保证包名的唯一性,要求程序猿在自己定义的包的名字前加上唯一前缀
- 由于互连网上的域名不会重复,所以推荐采用公司在互连网的域名的导致作为包的唯一前缀
包的用法
- 一个类可以使用同一个包中的所有类
- 一个类可以使用其他包中的所有公开类
怎么使用其他包中的公开类?
- 在每个类签名前加上完整包名,例如:
java.util.Data today = new java.util.Date();
- 更简洁更通用的方式:使用import语句来导包(eclipse:ctrl + shift + o),例如:
import java.util.Date;
······
Date today = new Date();
- 可以import特定类,也可以导入整个包。通过在源代码文件的顶部(在打包语句后)使用import语句来实现import语句来实现import java.util.*。
java三大特性之封装有关笔记记录完毕。