02 - 面向对象—进阶~三大特征之一封装、关键字this,static、包、权限修饰符及代码块

本次博客接着上次来写,上次主要详细讲解面向对象的基础——什么是面向对象、面向对象的思想、对象的内存分析以及相应的构方和重载等基础知识,相信大伙对于面向对象有一定了解了吧,接下来就跟着我步伐往深处研究探讨~~~

二、面向对象进阶

1、封装

1.1 概述

  • 封装的意义在于保护或者防止代码(数据)被我们无意中破坏;
  • 保护成员属性,不让类以外的程序直接访问和修改。

1.2 封装原则

  • 隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别。

1.3 举例

1、观察如下代码:

class Person{ 
	String name ; // 表示姓名 
	int age ; // 表示年龄 
	void tell(){ 
		System.out.println("姓名:" + name + ";年龄:" + age) ; 
	} 
};
public class Demo{ 
	public static void main(String args[]){ 
		Person per = new Person() ; 
		per.name = "张三" ; 
		per.age = -30 ; 
		per.tell() ; 
	} 
};

2、可以发现,per.age = -30;出现逻辑错误(年龄不可能为负数);

3,在开发中, 为了避免出现逻辑错误, 我们建议对所有属性进行封装,并为其提供setter及getter方法进行设置和取得 操作。

Eclipse中对setter及getter方法创建提供了两种快捷方式:

方法一:
在这里插入图片描述
方法二:
在这里插入图片描述
4,修改后的代码如下:(private修饰属性)

class Person{ 
	private String name ; // 表示姓名 
	private int age ; // 表示年龄 
	void tell(){ 
		System.out.println("姓名:" + getName() + ";年龄:" + getAge()) ; 
	}
	public void setName(String str){ 
		name = str ; 
	}
	public void setAge(int a){ 
	    if(a>0&&a<150) 
		age = a ;
            else{
                System.out.println("年龄设置不合理,自动设置为1");
                age = 1;
            } 
	}
	public String getName(){ 
		return name ; 
	}
	public int getAge(){ 
		return age ; 
	} 
};
public class Demo10{ 
	public static void main(String args[]){ 
		Person per = new Person() ;
		per.setName("张三") ; 
		per.setAge(-30) ; 
		per.tell() ; 
	} 
};

2、this关键字

2.1 概念

在Java基础中,this关键字是一个最重要的概念。使用this关键字可以完成以下的操作:

  • 调用类中的属性 ;
  • 调用类中的方法或构造方法 (在一个构造方法中,调用另一个构造方法时, 调用的代码必须编写在构造方法的第一行。因为在调用有参构造方法之前,对象尚未创建完毕,这时使用其他语句会报错);
  • this指的是当前对象;

2.2 举例

1、声明全参构造函数时,如果传递的参数和属性名称一致,就会出现问题:
在这里插入图片描述
2、解决方法:this.属性名
在这里插入图片描述
3、此外,还可以通过this在无参构造方法中调用有参构造方法
在这里插入图片描述
4,注意:在一个构造方法中,调用另一个构造方法时, 调用的代码必须编写在构造方法的第一 行;
在这里插入图片描述

3、静态static

在之前博客里也有涉及到static关键字的详解,感兴趣的读者可以返回到Java 关键字static 还搞不懂?看这一篇文章就足够了!详细解释!

3.1 概述

static表示“静态”的意思,可以用来修饰成员变量和成员方法(后续还会学习 静态代码块 和 静态内部类)。

static的主要作用在于创建独立于具体对象域变量或者方法

简单理解:

  • 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问只要类被加载了,就可以通过类名去进行访 问
  • 并且不会因为对象的多次创建 ,而在内存中建立多份数据

3.2 重点

静态成员 在类加载时加载并初始化。

  • 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )

类变量,是类的共享内容,只要赋值一次,都会使用第一次赋值的内容

比如 人类都有一个国家,国家使用static属性,假设国家为中国,创建6个对象,如果只赋值一次。6个对象的国家属性都是中国。如果第4个对象的国家改为英国,第5个和第6个国家属性值就为英国

  • 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !(静态表示对象未创建也可调用【只要类被加载即可】,而非静态必须等到对象创建完毕。所以使用静态时,对象可能还未创建,因此不能访问非静态)

3.3 举例

1,假设员工有属性:姓名、公司。声明若干个对象时,原先的做法如下:
在这里插入图片描述

2,当公司迁址,那么每个对象中的地址属性都需要进行修改(时间开销大)。此外公司地址都是相同的,不同对象重复的创建地址变量,有浪费空间的嫌疑(空间开销大);

当前内存状况如下:
在这里插入图片描述

3,解决方法:static修饰

使用static修饰的变量,存放在方法区中:
在这里插入图片描述
4,static修饰的变量,可以理解为类的属性,直接通过类名来调用,所以在创建对象之前就可以调用
在这里插入图片描述

4、包

4.1 介绍

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

2、包如同文件夹一样,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

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

4.2 使用规则

1、包中java文件的定义:

在.java文件的首部, 必须编写类所属那个包, 格式: package 包名;
2、包的定义:

通常由多个单词组成, 所有单词的字母小写, 单词与单词之间使用.隔开 ,一般命名为“com.公司名.项目名.模块名…”。
3、规范由来:

由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的Java Package,为了保障每个Java
Package命名的唯一性,在最新的Java编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。例如:
com.java.xxx

4.3 实例

1,如何实用工具包?

当所需的工具类不在当前文件夹中时,需要通过import 进行导包;

如果不想通过import导包的话,也可以通过使用类全名的方法实现相同的功能;
在这里插入图片描述
2,什么情况不需要导包?

  • 一些常用的系统包,比如String类型,包含在java.lang包中;
  • 使用当前包中的类;

5、权限修饰符

在这里插入图片描述

6、代码块

6.1 代码块分类

1.普通代码块

  • 在执行的流程中 出现的 代码块, 我们称其为普通代码块。

2.构造代码块

  • 在类中的成员代码块, 我们称其为构造代码块, 在每次对象创建时执行, 执行在构造方法之前。

3.静态代码块

  • 在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时执行。 每次程序启动到关闭 ,只会执行一次的代码块。

4.同步代码块

  • 在后续多线程技术中学习。

面试题:构造方法 与 构造代码块 以及 静态代码块的执行顺序:

  • 静态代码块 --> 构造代码块 --> 构造方法

6.2 构造代码块

1,随着对象的每次创建,执行一次。 且执行在构造方法之前:
在这里插入图片描述
2,为什么需要构造代码块呢?

与构造方法不同,构造方法不一定会被执行(构造方法可能会重载,这样使用无参构造方法就不会调用一参或两参的构造方法);

所以当多个构造方法需要同一种操作时,可以使用代码块(可以有多个);
在这里插入图片描述
关于构造代码块 还有一道练习题,想熟悉下技能的你们 可以康康我之前写着一篇博客 02 Java面向对象—第3节 面向对象进阶

6.3 静态代码块

在代码块前加static

静态代码块,随着类的加载 (第一次使用) ,静态代码块执行

因为类只加载一次,所以静态代码块只执行一次

举例如下:
在这里插入图片描述

7、main方法详解

main()方法一直写到了今天:

public static void main(String args[])

以上的各个参数的含义如下:

  • · public:表示公共的内容,可以被所有操作所调用 · static:表示方法是静态的,可以由类名称直接调用。javaStaticDemo09
  • · void:表示没有任何的返回值操作
  • · main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
  • · String[] args:字符串数组,接收参数的
public class StaticDemo10{ 
    public static void main(String args[]){ 
        for(int i=0;i<args.length;i++){ 
        System.out.println(args[i]) ; 
    } 
} 

所有的参数在执行类的时候以空格进行分割。

java StaticDemo10 1 2 3 4 5 6 7 

但是,如果现在我要输入的是以下几种参数“hello world”、“hello vince”、“hello mjw”。

因为以空格分割,所以以上的三组参数会当做六组参数输入,那么此时如果要想完成有空格的内容输入,则参数需 要使用 ** “"” ** 括起来。

java StaticDemo10 "hello world" "hello vince" "hello mjw"

(ps:接下来还会分享面向对象进阶知识,很nice吧~ 各位继续噶油!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

涛涛同学debug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值