- 静态变量和静态函数
- 封装
- 包
- 访问控制修饰符
- 类中类
静态变量的定义:
在JAVA中类在声明的时候,其实并没有申请和产生内存空间,就如同我们的一个切实可行的想法,但其实并没有去实施这个想法。而类只有在用这种数据类型创建一个类的对象的时候,才能在内存中申请和产生类大小的内存空间,这一块内存空间是用来存放成员变量和成员函数的备份。所以在类声明的时候,是不可以对成员变量进行初始化的,只有用类创建的对象时,才能通过对象对变量初始化,SO,便产生的静态变量!!!它对所有的类对象都是很公共的,对每一个类的对象都具有相同的值。静态变量的关键字是static,它的语法是:
Static <数据类型> <静态变量名> = <初始化静态变量> ;
调用静态变量:
静态变量在声明的时候就同时初始化,并且只能初始化一次,它有自己的变量作用域,但具有全局的生命周期,可以随时被调用。它声明的时候内存中就从开始一直保留一份值。在类的对象没有被创建之前可以使用类名调静态成员变量,它的语法是:
<类名> . <静态成员变量> ;
静态函数:
既然有了静态变量那就会有静态函数,静态函数只有访问静态变量,其它非静态的函数是不被允许的,但在静态成员函数中可以声明它自身的变量,它也是一个函数也具有其它函数的特性!静态函数的声明和静态变量的声明所差无几:
Static <数据类型> <静态函数名> (变量表) ;
和静态变量一样,静态函数在声明的时候就在内存中存在(即使没有创建对象这和其它的非静态函数是不一样的),也具有全局的生命周期。
下面给出一个静态函数和静态变量的例子:
import java.io.*; //导入io流
public class Text_Static
{undefined
int iNum1;
static int iNum2;
Text_Static(int iNum1,int iNum2)
{undefined
this.iNum1=iNum1;
this.iNum2=iNum2;
this.iNum1++;
this.iNum2++;
}
public void Display1(String str)
{undefined
System.out.println(str+".iNum1="+iNum1);
}
//静态函数只能访问静态变量
public static void Display2(String str)
{undefined
System.out.println(str+".iNum2="+iNum2);
}
public static void main(String[] args)
{undefined
Text_Static Obj1=new Text_Static(1,2);
Obj1.Display1("Obj1"); //输出:iNum1=2
Obj1.Display2("Obj1"); //输出:iNum2=3
Text_Static Obj2=new Text_Static(10,20);
System.out.println();
Obj2.Display1("Obj2"); //输出:iNum1=11
Obj2.Display2("Obj2"); //输出:iNum2=21
Obj1.Display1("Obj1"); //输出:iNum1=2
Obj1.Display2("Obj1"); //输出:iNum2=21
}
}
封装(数据的隐藏):
封装是面向对象的基本特征之一。 将东西包在一起,然后以新的完整形式呈现出来。
将方法和字段一起包装到一个单元中,单元以类的形式实现。信息隐藏,隐藏对象的实现细节,不让外部直接访问到。将数据和方法包装进类中,加上具体的实现的隐藏(访问修饰符),共同被称作封装,其结果是一个同时带有特征和行为的数据类型。
定义类、定义其属性、方法的过程称为封装类
实现封装:
/*
编程实现Person类的封装
*/
public class Person{
//1.私有化成员变量,使用private关键字修饰
private String name;
private int age;
private String country;
//使用static关键字修饰成员变量表示提升为类层级只有一份被所有对象共享
//public static String country;
//3.在构造方法中调用set方法进行合理值的判断
public Person(){
}
public Person(String name, int age, String country){
setName(name);
setAge(age);
setCountry(country);
}
//2.提供公有的get和set方法,在方法体中进行合理值的判断
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
if(age > 0 && age < 150){
this.age = age;
}else{
System.out.println("年龄不合理!!!");
}
}
public String getCountry(){
return country;
}
public void setCountry(String country){
this.country = country;
}
public void show(){
System.out.println("我是" + getName() + ",今年" + getAge() + "岁了,来自" + getCountry() + "!");
}
//自定义成员方法描述吃饭的行为
public void eat(String food){
System.out.println(food + "真好吃!");
}
//自定义成员方法描述娱乐的行为
public void play(String game){
System.out.println(game + "真好玩!");
}
}
包(Package):
类似于将文件用文件夹管理,将大量类按照实际需要放到相同或不同的包里面。
- package 语句必须放在源代码文件的最前面,但也可不指定包。
- 推荐包的名字小写
- 如果要用命令行来运行某个包中的类,必须首先到达包目录所在上一级目录来下命令
访问包中的类:
- 在同一个包中直接用类名来访问,不用指定类所在的包
- 两个类不在同一个包中
1)在使用类时指定类的路径
2)用 import 语句导入该类
访问控制修饰符:
类的访问控制修饰符:
public: 表示公开的,在任何位置都可以访问 (即所有类可见)
使用的对象:类、接口、变量、方法
protected: 同包以及所有的子类
使用对象:变量、方法。
注意:不能修饰类(外部类)。
缺省: 同包,不使用任何修饰符
使用的对象:类、接口、变量、方法
private: 私有的,在同一类中访问
使用的对象:变量、方法
注意:如果将一个类定义为public类,类名和文件名必须相同,因此在一个 .Java文件中最多只能有一个public类
成员的访问控制符:
1)private:
成员只能在定义它的类的内部被访问
2)default:
成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问
3)protected:
成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问,还可以被包外的子类访问
4)public:
成员可以在定义它的类的内部被访问,也可以被包内,包外的所有其他类访问
很明显,从开放的程度上讲有
private < default < protected < public
类中类:
类中类,顾名思义是在类中定义了类,又称为内部类
public class OuterClass {undefined
private String name ;
private int age;
public String getName() {undefined
return name;
}
public void setName(String name) {undefined
this.name = name;
}
public int getAge() {undefined
return age;
}
public void setAge(int age) {undefined
this.age = age;
}
class InnerClass{undefined //内部类(类中类)
public InnerClass(){undefined
name = "chenssy";
age = 23;
}
}
}
注意:
- 内部类中的成员只在内部类范围内才能用,外部类不能像使用自己的成员变量一样使用他们
- 如果在内部类中使用 this ,仅代表内部类的对象,因此也只能引用内部类的成员