简介
👨💻个人主页:@云边牧风
👨🎓小编介绍:欢迎来到云边牧风破烂的小星球🌝
📋专栏: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关键字
例如:
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);
}
}
所有允许结果为👉:
二、包(package)
what is 包?
•包是Java中有效的管理类的一个机制。(即我们需要的类(class)可以把好几个放进一个包(package)里面,package就相当于文件管理里面的文件夹)
是一个用于区别类名的命名空间。
2.1、包语句
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.2、import 语句
import其实就是拿来使用包的(没有包package就没有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();
}
}
注意:
三、访问权限
(这个用的不多,理解就行,但是理解不好的话,代码容易出现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私有变量和私有方法
回到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共有变量和共有方法
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友好变量和友好方法
即👉:同一个包package下的类,就相当于一个圈子里的朋友一样,可以资源共享
3.6受保护的成员变量和方法
但放在继承里面的时候:
3.7对于私有变量,如何在类外访问?
在其他类中可以通过get、set方法访问另一个类的私有变量👇:
class Main {
public static void main(String args[]) {
Teacher 小编 = new Teacher();
小编.setName(“文森”);
小编.setHeight(175);
System.out.println(小编.getName());
System.out.println(小编.getHeight());
}
}
//以上是被允许的!!!!
3.8get、set方法说明:
– 是 Java 中经常使用的一种机制(很实用!!!)– 实现了 类的封装性 ,即:数据对外部是隐藏的,外部只能看到方法– 实现了 对私有成员变量的保护 ,同时又提供了访问方法– 又称为 访问器 和 修改器
3.9public类与友好类
例如👇:
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”。所以,可简单的把对象myCooker和myRefrigerator放在类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
⑤制作公有的set和get方法与外界通过消息调用的方式通信
⑥在主类中实现对业务类StuCard的读、写、修改属性等功能
结束语:
以上是Jav第二章的第3节,希望大家喜欢
下一节开始讲第三章继承与多态啦
喜欢的可以点赞+关注哈 ❤