Java入门第二章第3节:Java关键字、包和访问权限 实验+图解讲解

简介

👨‍💻个人主页@云边牧风
👨‍🎓小编介绍:欢迎来到云边牧风破烂的小星球🌝
📋专栏:Java基础知识
🔑本章内容:Java关键字、包、访问权限和类的组合
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~

一、关键字

接着第二章第2节的内容,上一节讲到了类的方法和对象,这次我们讲Java关键字、包、访问权限和类的组合;先看关键字的内容:

1、static关键字

类变量与类方法:
static 修饰的成员变量称为 类变量
static 修饰的方法称为 类方法

1.1、实例变量和类变量的区别

一个类通过 new 运算符可以创建多个对象,每个对象的 实例变量将被分配不同的内存空间
而对于 类变量 ,每个对象的类变量都共享同一内存空间,因此, 改变其中一个对象的类变量的值,会影响其它对象的这个类变量

从内存分配上来说:
实例变量的内存在创建对象时才会分配 ,不同的对象分配 不同地址
类变量的内存在加载类时就创建好了 ,不管这个类是否创建了对象,类变量地址 固定不变 。(这句话一定要理解、记住)
例如:
class 西游记人物 {  

  static String  发型;

  double  体重=70;

  西游记人物(String s,double x) {
  发型=s;体重= x;
  }
}

执行代码:

西游记人物   悟空 = new  西游记人物("毛寸",75 );

西游记人物   沙僧= new  西游记人物("溜冰场", 90 );//因为“发型”被static修饰了,所以它是个类变量,当沙僧和悟空公用一个“发型”时,因为他们是共用一个内存的,所以当沙僧的发型进行初始化时,会把悟空的给覆盖了(被代替了),所以最后悟空的毛寸就会变成沙僧的溜冰场

System.out.println(沙僧.发型);

System.out.println(沙僧.体重);

System.out.println(悟空.发型);

System.out.println(悟空.体重);

综上运行的代码为👇:

class 西游记人物 {

    static String 发型;

    double 体重=70;

    西游记人物(String s,double x) {
        发型=s;体重= x;
    }
}
public class Main {
    public static void main(String[] args) {
        西游记人物 悟空 = new 西游记人物("毛寸",75 );

        西游记人物 沙僧= new 西游记人物("溜冰场", 90 );

        System.out.println(沙僧.发型);

        System.out.println(沙僧.体重);

        System.out.println(悟空.发型);

        System.out.println(悟空.体重);
    }
}

结果为:

以上就是实例变量和类变量的区别了(后期写代码的时候一定要留个心眼)

1.2、实例方法和类方法的区别

实例方法 也是在 创建对象时才分配入口地址 的,但是,后面所创建的对象共享第一个对象创建时生成的入口地址,也就是说, 方法的入口地址被所有对象共享
所有对象都不存在时 ,实例方法的入口地址才被 回收
而对于 类方法 ,入口地址在 加载类时就分配 了,无论类是否创建了对象,该 入口地址都可以直接使用 (用类名直接调用)。
程序退出 时,类方法的入口地址才被 回收

2、this关键字

this 表示“ 当前对象 ”。(就是“这个”的意思)
this 可以出现在实例方法和构造方法中,但 不可以出现在类方法中
this 关键字出现在类的 构造方法中 时,代表使用该构造方法所创建的对象。
this 关键字出现在类的 实例方法中 时,代表正在调用该方法的当前对象。

例如:

class A {    //定义一个类:A
    int x;   //实例变量 整型的x
    A(int x) {    //构造方法A
        this.x = x;    //this出现在类的构造方法中时,代表使用该构造方法所创建的对象。
    }
    void setx(int x){    //实例方法 setx
        this.x = x;    //this出现在类的实例方法中时,代表正在调用该方法的当前对象。
    }
}
public class Main {
    public static void main(String[] args) {
        A a1 = new A( 10 );    //使用类的构造方法,允许
        A a2 = new A( 100 );   //使用类的构造方法,允许
        System.out.println(a1.x);
        System.out.println(a2.x);
        a1.setx( 20 );     //使用类的实例方法 允许
        a2.setx( 200 );    //使用类的实例方法,允许
        System.out.println(a1.x);
        System.out.println(a2.x);
    }
}

所有允许结果为👉:

this 关键字还可以在构造方法中调用其他构造方法:

二、包(package

what is 包? 

 •包是Java中有效的管理类的一个机制。(即我们需要的类(class)可以把好几个放进一个包(package)里面,package就相当于文件管理里面的文件夹)

一个用于区别类名的命名空间。

2.1、包语句

通过关键字 package 声明包语句。 package 语句作为 Java 源文件的第一条语句 ,指明该源文件定义的类所在的包。 package 语句的一般格式为:

package  包名 ;
如果源程序中 省略了 package 语句 ,那么:
源文件中定义命名的类被隐含地认为是“
无名包(缺省包) ”的一部分,即: 源文件中定义命名的类在同一个包中,但该包没有名字
包名可以是一个合法的标识符,也可以是若干个标识符加“ .” 分割而成

2.1.2包的作用

  • 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

  • 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

  • 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

例如:

package  cn.edu.upc.cs1;   //那么它的路径应该是 cn/edu/upc/cs1
public class  Clock{       //对于Clock类,则是cn/edu/upc/cs1/Clock.java这样保存的。
    int hour ;
    int minute ;
    int second ;
    public void setTime(int newH, int newM, int newS){  
		   hour=newH ;  
         minute=newM ;  
         second=news ;  
    }
    public void showTime(){ 
		   System.out.println(hour+":"+minute+":"+second);
    }
}

注意:包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。

2.1.3包的创建

在项目(project)的目录下,选需要打包的地址→右键→new→package

 然后输入包名→Enter键——即可创建一个包

2.2import 语句

import其实就是拿来使用包的(没有包package就没有import)🤫🤫🤫

使用 import 语句可以 引入包中的类 。例如:
引入一个包中的所有类:
import   java.awt .*;
引入某个类:
import   java.util.Date ;

例如👇:

package  cn.edu.upc.cs2;//把这里的类,打包到了cs2的包中
import  cn.edu.upc.cs1.*;//引用了cs1的包,而且是引用了cs1所有的类
public class  Main{ 
	public static void main(String[] args){
    	    Clock time=new Clock();//这个Clock类就是上一个代码——存在cs1中的Clock类
          time.setTime( 16, 10, 30 );
          time.showTime();
	}
}

注意:

Java 自动载入 java.lang 包中的所有类 ,因此不需要显式的 import
java.lang 包中包含了系统的核心类,是程序运行必不可少的。
如果 import 引入了整个包中的类,那么会 增加编译时间,但是不会影响程序运行性能 ,因为 Java 是动态加载类的。(这个跟C++中引用万能头有相似的地方,Java增加的是编译时间,而C++增加的是内存)

三、访问权限

(这个用的不多,理解就行,但是理解不好的话,代码容易出现bug)

所谓 访问权限 是指对象 是否可以通过“ .” 运算符操作自己的变量,或使用类中的方法
访问限制修饰符有 private protected public ,或者可以 无修饰符

3.1问题:访问权限有什么用处?

用来限制在 其他类中 通过对象 访问该对象的成员变量或方法的权限
注意:在定义类的时候, 本类中 实例方法总是可以访问该类的成员变量;类方法总是可以操作该类中的类变量, 与访问限制符无关系
即——访问权限只存在于不同的类之间

而在其他类中,访问存在限制:

例如👇:

class Teacher  {   
    public String  name; 
    private double  height;
    public void setInfo(String n,double h) {
	name = n;
  height = h;	
    }
}
class Main{
    public static void main(String args[]){
          Teacher  小编=new Teacher();
          小编.name="文森";
          小编.height=175;//非法——出错啦!!!   因为height是被private修饰的除了Teacher的方法能访问(修改),别的都不可以碰它
    }
}

既然上面不可以,那我们可以改为这样的👇:

class Teacher  {   
    public String  name; 
    private double  height;
    public void setInfo(String n,double h) {
	name = n;
  height = h;	
    }
}
class Main{
    public static void main(String args[]){
          Teacher  小编=new Teacher();
     小编.setInfo("文森",175);//height是Teacher的家事,只能由teacher家人管教
    }
}

3.2问题:为什么要设置访问权限?

保护数据
类封装了本身特有的成员和方法,尽量将数据“私有化”可以尽可能的保护这些数据,使类的职责“分工明确”。

3.3私有变量和私有方法

private 修饰
本类中的实例方法 可以访问本类的私有变量和方法
在其他类中通过 本类的对象 不能访问 该对象的私有变量和方法:
在类 B 中创建了类 A 的对象 a ,则 a 不能访问自己的私有变量和方法

回到3.2中的例子👇:

class Teacher  {   
    private String  name; 
    private double  height;
    public void setInfo(String n,double h) {
	name=n;   
           height = h;	
    }
}
class Main{
    public static void main(String args[]){
          Teacher   小编=new Teacher();
          小编.name=“文森”;//出错
          小编.height=175;//出错
    }
}

3.4共有变量和共有方法

public 修饰
本类中的实例方法 可以访问本类的共有变量和方法
在其他类中通过 本类的对象 可以访问 该对象的共有变量和方法:
在类 B 中创建了类 A 的对象 a ,则 a 可以访问自己的共有变量和方法
class Teacher  {   
    public String  name; 
    public double  height;
    public void setInfo(String n,double h) {
	name=n;   
           height = h;	
    }
}
class ex1{
    public static void main(String args[]){
          Teacher   小编=new Teacher();
          小编.name=“文森”;//合法
          小编.height=175;//合法
    }
}
可以说, 某个对象的 public 成员允许在任何类的对象中访问而不受限制。
同理,对于一个类的 共有类变量 ,那么在另外一个类中,也能通过类名来操作这个共有类变量。

3.5友好变量和友好方法

无修饰符 修饰的变量和方法称为友好变量和友好方法,或简称“ 友元
即使 在其他类中创建该类的对象 ,如果这两个类在同一个包中,该对象也能访问自己的友好变量和友好方法
在类 B 中创建了类 A 的对象 a ,若类 A 和类 B 在同一包中,则 a 能访问自己的友元

即👉:同一个包package下的类,就相当于一个圈子里的朋友一样,可以资源共享

3.6受保护的成员变量和方法

protected 修饰
即使 在其他类中创建该类的对象 ,如果这两个类在同一个包中,该对象也能访问自己的受保护的成员变量和方法
在类 B 中创建了类 A 的对象 a ,若类 A 和类 B 在同一包中,则 a 能访问自己的 protected 成员和方法
“友元”的权限 基本一致,只是 在类继承的访问限制 上有区别

但放在继承里面的时候:

3.7对于私有变量,如何在类外访问?

例如:在类 B 中创建了类 A 的对象 a ,如何让 a 访问自己的 private 变量和方法?
如前所述:“对象的方法可以自由的访问其成员变量”,因此,我们可以 设置几个 能够在类外访问的共有方法来读写私有变量 。(即:借他的手来干他的事)

在其他类中可以通过getset方法访问另一个类的私有变量👇:

class Main  { 
    public static void main(String args[]) {
    	Teacher 小编 = new Teacher();
	小编.setName(“文森”);
	小编.setHeight(175); 
	System.out.println(小编.getName());   
	System.out.println(小编.getHeight()); 
    }
}
//以上是被允许的!!!!

 3.8getset方法说明:

Java 中经常使用的一种机制(很实用!!!)
实现了 类的封装性 ,即:数据对外部是隐藏的,外部只能看到方法
实现了 对私有成员变量的保护 ,同时又提供了访问方法
又称为 访问器 修改器

3.9public类与友好类

public 修饰的类称为共有类
Ø 可以在任何另外一个类中使用该类创建对象  
没有 public 修饰的类,称为友好类
Ø 同一个包中 的没有 public 修饰的类,称为友好类
注意:不能用 protected private 修饰类,只能修饰类的变量

例如👇:

package  A;
class  Clock{ 
    int hour ;
    int minute ;
    int second ;
    public void setTime(int newH, int newM, int newS){  
		   hour=newH ;  
         minute=newM ;  
         second=news ;  
    }
    public void showTime(){ 
		   System.out.println(hour+":"+minute+":"+second);
    }
}

在Main中可以执行代码为:

package  B;
import  A.*;
public class  Main{ 
	public static void main(String[] args){
    	    Clock time=new Clock();
          time.setTime( 16, 10, 30 );
          time.showTime();
	}
}

3.10类的组合

面向对象编程的一个重要思想就是用软件对象来模仿现实世界的对象

现实世界中,大多数对象由更小的对象组成(分而治之)

与现实世界的对象一样,软件中的对象也常常是由更小的对象组成

Java的类中可以有其他类的对象作为成员,这便是类的组合

组合的语法很简单,只要把已存在类的对象放到新类中即可

可以使用“has a语句来描述这种关系

例如,考虑Kitchen类提供烹饪和冷藏食品的功能,很自然的说“my kitchen 'has a' cooker/refrigerator”。所以,可简单的把对象myCookermyRefrigerator放在类Kitchen中。格式如下

class Cooker{   // 类的语句  }

class Refrigerator{   // 类的语句}

class Kitchen{  

  Cooker myCooker;

    Refrigerator myRefrigerator;

}

具体代码可以为👇:

一条线段包含两个端点

public class Point   //点类

{

     private int x, y; 

     public Point(int x, int y) { this.x = x; this.y = y;}

     public int getX()  {  return x; }

     public int getY()  {  return y; }

}

class Line   //线段类

{

   private Point  p1,p2;     // 两端点

   Line(Point a, Point b) { 

      p1 = a;

      p2 = b;

   }

    public double Length() { //求两点间的距离

      return Math.sqrt(Math.pow(p2.getX()-p1.getX(),2)  + Math.pow(p2.getY()-p1.getY(),2));

    }

}

总结:

练习:

     定义类StuCard,用到类成员变量(人数)和实例成员变量:学号、姓名、性别、专业、年级、籍贯等

      初始化的时候用到构造方法,提供两个以上构造方法

      多个类(业务类StuCard和测试主类),用到包的概念,且分别放到不同的包中

      用到类成员访问权限,要求类成员变量为public,实例成员变量为private

      制作公有的setget方法与外界通过消息调用的方式通信

      在主类中实现对业务类StuCard的读、写、修改属性等功能

结束语:

以上是Jav第二章的第3节,希望大家喜欢

下一节开始讲第三章继承与多态啦

喜欢的可以点赞+关注哈 ❤

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云边牧风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值