目录
1、变量的作用域
(1)全局变量:
1)定义在类中方法外(循环结构外)的变量
2)成员变量的作用域是整个类中
3)成员变脸可以不进行初始化,系统会给其一个默认值
4)同一个类中不能有同名的全局变量
5)同一个类中可以有同名的全局变量和局部变量,局部变量有更高的优先级
(2)局部变量:
1)定义在方法内(循环结构内)的变量
2)局部变量的作用仅限于定义它的结构内
3)局部变量在使用之前要进行初始化,否则程序会报错
4)同一个方法中不能有同名的局部变量
(3)比较:
1)作用域不同
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
2)初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
举例:
public class Demo {
int num ;//全局变量
public void test(){
int number;//局部变量
int num=20;//局部变量初始化
System.out.println(num);//结果20
//System.out.println(number);//The local variable number may not have been initialized 局部变量没有初始化
}
public void demo(){
int number;//局部变量没有初始化
// System.out.println(number);
}
}
2、封装
(1)封装的概念:将尽可能多的信息隐藏在类的内部,不让外部程序直接访问,而是通过类提供的公共的get/set方法进行访问
(2)封装实现步骤:
1)使用private修饰要封装的内容
2)提供getXxx/setXxx方法
3)在setXxx方法里对数据进行判断操作
(3)封装的好处
1)便于使用者正确使用系统,防止错误修改属性
2)有助于系统之间的松耦合,提高系统独立性
3)提高软件的可重用性
4)降低了构建大型系统的风险
(4)举例
1)需求说明
使用封装实现电子宠物系统的企鹅类正确输入健康值和亲密度
保证健康值的有效性(0-100),否则取默认值60
保证亲密度的有效性(0-100),否则取默认值60
2)实现代码:
Dog类:
public class Dog {
private String name;
private int health;
private int love;
private String gender;
public Dog() {
super();
}
public Dog(String name, int health, int love, String gender) {
super();
this.name = name;
this.health = health;
this.love = love;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
if(health<0||health>100){
System.out.println("健康值在1-100之间,默认值为60");
this.health=60;
return;
}
this.health = health;;
}
public int getLove() {
return love;
}
public void setLove(int love) {
if(love<0||love>100){
System.out.println("亲密度值在1-100之间,默认值为60");
this.love=60;
return;
}
this.love = love;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
//定义方法:实现宠物自白
public void show(){
System.out.println("宠物自白:");
System.out.println("我的名字叫:"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我的性别是:"+this.gender);
}
}
Penguin类:
public class Penguin {
private String name;
private int health;
private int love;
private String gender;
public Penguin() {
}
public Penguin(String name, int health, int love) {
super();
this.name = name;
this.health = health;
this.love = love;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
if(health<0||health>100){
System.out.println("健康值在1-100之间,默认值为60");
this.health=60;
return;
}
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
if(love<0||love>100){
System.out.println("亲密度值在1-100之间,默认值为60");
this.love=60;
return;
}
this.love = love;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
//定义方法:实现宠物自白
public void show(){
System.out.println("宠物自白:");
System.out.println("我的名字叫:"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我的性别是:"+this.gender);
}
}
PenguinTest类:
import java.util.Scanner;
public class PenguinTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Penguin penguin = new Penguin();
Dog dog = new Dog();
System.out.println("欢迎来到宠物店");
System.out.println("请输入要领养的宠物名字:");
String name =input.next();
System.out.println("请选择要领养的宠物类型(1、狗狗 2、企鹅):");
int chooseAnimal =input.nextInt();
if(chooseAnimal==1){
System.out.println("请选择狗的性别(1、狗仔 2、狗妹):");
int chooseGender=input.nextInt();
String gender = chooseGender==1?"狗仔":"狗妹";
System.out.println("请输入狗的健康值(1-100之间):");
int health = input.nextInt();
dog.setName(name);
dog.setGender(gender);
dog.setHealth(health);
dog.show();
}else{
System.out.println("请选择企鹅的性别(1、Q仔 2、Q妹):");
int chooseGender=input.nextInt();
String gender = chooseGender==1?"Q仔":"Q妹";
System.out.println("请输入企鹅的健康值(1-100之间):");
int health = input.nextInt();
penguin.setName(name);
penguin.setGender(gender);
penguin.setHealth(health);
penguin.show();
}
}
}
3、包
(1)包的作用
1)允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件
2)防止命名冲突,区分名字相同的类
3)有助于实施访问权限控制
(2)在一个类中使用不同包里的同名类:将类所在的包名也写上
java.util.Date date1 = new java.util.Date();
java.sql.Date date2 = new java.sql.Date(12345678L);
(3)如何创建包
用package声明包,以分号结尾,作为Java源代码第一条语句
(4)包命名规范
1)包名由小写字母组成,不能以圆点开头或结尾
package mypackage;
2)包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
package net.javagroup.mypackage;
3)包名后续部分依不同机构内部的规范不同而不同
package net.javagroup.research.powerproject;
(4)用MyEclipse创建包
1)JDK提供基本包
java.lang:虚拟机自动引入
java.util:提供一些实用类
java.io:输入、输出
2)使用MyEclipse创建包的两种方法
a.分别创建包和类
b.创建类的过程中创建类所在的包
(5)如何导入包
1)为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类:
import 包名. 类名;
2)
导入系统包:java.util
导入自定义包:cn.jtest.classandobjec
(6)使用包的注意事项
1)一个类同时引用了两个来自不同包的同名类,必须通过完整类名来区分
2)每个包都是独立的,顶层包不会包含子包的类
3)package和import的顺序是固定的
package必须位于第一行(忽略注释行),只允许有一个package语句,其次是import,接着是类的声明
4)同一个包中不能有同名的类文件
5)同一个类文件中可以声明多个类,但是一个类文件中只能有一个public修饰的类,并且这个类名要和文件名保持一致
6)一般在一个类文件中只写一个类
4、访问权限控制
(1)访问权限控制:类的访问控制;类成员的访问控制
(2)类的访问修饰符
public修饰符:公有访问级别
默认修饰符:包级私有访问级别
(3)类成员的访问修饰符
同一类中 同包里的非子类 不同包里的非子类
public: 可以 可以 可以
protected: 可以 可以 可以
private: 可以 不可以 不可以
默认修饰符: 可以 可以 不可以
同一个类中 | 同包非子类 | 子类中 | 任何地方 | |
private | 可以 | 不可以 | 不可以 | 不可以 |
默认修饰符 | 可以 | 可以 | 不可以 | 不可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
public | 可以 | 可以 | 可以 | 可以 |