技术标签: 构造方法 java 面向对象编程 访问权限 封装
本文原创首发CSDN,本文链接https://blog.csdn.net/qq_41464123/article/details/107461710 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,谢谢配合。
目录
Java是一门当今最火的编程语言之一,拥有很多现成可用的库,在我们编程生涯中,有着无比重要的地位。
Java中有个概念叫做访问权限。它们是什么呢?今天我来详细讲解。
本文所有代码已经上传CSDN下载模块,下载地址,也可以在文章下方的评论区找我要,谢谢!
在内部类中,会涉及到访问权限的概念;而在访问权限中,会涉及到构造方法的概念,所以我们先来学习什么是构造方法。
我们先来编写一个最简单的类 —— 人,并且不用Java的封装。
public class People {
String name;
int age;
}
人有两个属性,分别是名字name和年龄age。
接着编写一个主函数,实例化这个类,并且输出它的属性。
public class Main {
public static void main(String[] args) {
People people = new People();
people.name = "ZWZ";
people.age = 18;
System.out.println("姓名 = " + people.name + ", 年龄 = " + people.age);
}
}
输出结果如下图所示:
很好,那么我们如果要实例化五个类呢?很简单,我们写五遍就好了
public class Main {
public static void main(String[] args) {
People people1 = new People();
people1.name = "ZWZ01";
people1.age = 18;
People people2 = new People();
people2.name = "ZWZ02";
people2.age = 18;
People people3 = new People();
people3.name = "ZWZ03";
people3.age = 18;
People people4 = new People();
people4.name = "ZWZ04";
people4.age = 18;
People people5 = new People();
people5.name = "ZWZ05";
people5.age = 18;
System.out.println("姓名 = " + people1.name + ", 年龄 = " + people1.age);
System.out.println("姓名 = " + people2.name + ", 年龄 = " + people2.age);
System.out.println("姓名 = " + people3.name + ", 年龄 = " + people3.age);
System.out.println("姓名 = " + people4.name + ", 年龄 = " + people4.age);
System.out.println("姓名 = " + people5.name + ", 年龄 = " + people5.age);
}
}
那么聪明的你又没有想过,能不能简化对类的实例化操作呢?
当然可以!这就需要用到构造方法。
我们现在People.java类中添加构造方法,构造函数访问权限默认即可
public class People {
String name;
int age;
People(String name,int age){
this.name = name;
this.age = age;
}
}
这个时候,People类自带的无参构造方法就失效了。
PS:当你没有为类写构造方法时,系统会默认给你安排一个无参的构造方法,当你自己写了构造方法之后,系统自带的就会消失。
接着我们在主函数实例化类的时候,传入参数就可以了,代码是不是简单了很多?
public class Main {
public static void main(String[] args) {
People people1 = new People("ZWZ01",18);
People people2 = new People("ZWZ01",18);
People people3 = new People("ZWZ01",18);
People people4 = new People("ZWZ01",18);
People people5 = new People("ZWZ01",18);
System.out.println("姓名 = " + people1.name + ", 年龄 = " + people1.age);
System.out.println("姓名 = " + people2.name + ", 年龄 = " + people2.age);
System.out.println("姓名 = " + people3.name + ", 年龄 = " + people3.age);
System.out.println("姓名 = " + people4.name + ", 年龄 = " + people4.age);
System.out.println("姓名 = " + people5.name + ", 年龄 = " + people5.age);
}
}
这就是构造方法。
当然你也可以把输出信息放在构造方法内部,那也完全可以,就像这样:
public class People {
String name;
int age;
People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年龄 = " + this.age);
}
}
主函数就直接做实例化操作即可。
public class Main {
public static void main(String[] args) {
People people1 = new People("ZWZ01",18);
People people2 = new People("ZWZ01",18);
People people3 = new People("ZWZ01",18);
People people4 = new People("ZWZ01",18);
People people5 = new People("ZWZ01",18);
}
}
总结起来一句话!构造方法就是在我们实例化类的时候,给类的指定变量赋值、执行指定方法。
本文原创首发CSDN,本文链接https://blog.csdn.net/qq_41464123/article/details/107461710 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,谢谢配合。
在讲内部类之前,必须要理解Java的访问权限。
Java语言采用访问控制修饰符,来控制类、成员方法、成员变量的访问权限,共分为以下四个级别:
(1)public 公开,对外部访问不做限制。
(2)protected保护,只对子类和同一个包下的类公开。
(3)默认级保护,不加修饰符,只对同一个包下的类公开。
(4)private私有保护,只有自己才能访问,不对外公开。
其中:以上访问级别只适用于类和类的成员,不适用于局部变量。
成员变量、成员方法、构造方法都可以使用上面的四种访问级别。
先把结论写出来,后面一一证明。
private | 默认 | protected | public | |
---|---|---|---|---|
同一类的成员 | √ | √ | √ | √ |
同一个包的其他类(包括子类) | × | √ | √ | √ |
不同包的子类 | × | × | √ | √ |
不同包的非子类 | × | × | × | √ |
在第一块已经讲解了Java的构造方法,我们就以构造方法为例,讲解Java的访问权限
首先是public 公开,我们将People类的构造方法的访问权限定义为public
public class People {
String name;
int age;
public People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年龄 = " + this.age);
}
}
用自己包下的测试函数,跑一波
public class Main {
public static void main(String[] args) {
People people = new People("ZWZ01",18);
}
}
发现没毛病,可以正常实例化People类。
总结:使用public修饰访问权限,所有类都可以访问到此构造方法。
我们在cn.ypc(下面简称A包)的People的构造方法,改成 protected 类型
package cn.ypc;
public class People {
String name;
int age;
protected People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年龄 = " + this.age);
}
}
测试A包下的主函数
package cn.ypc;
public class Main {
public static void main(String[] args) {
People people = new People("ZWZ01",18);
}
}
发现可以正常实例化
接着测试cn.yy包(以下简称B包)下的测试函数
IDE报错了,以我的英语水平都能看出来,按照中文式翻译方法
The constructor People(String, int) is not visible
这个 结构体(类) People(String, int) 是 不 可见的
聪明的读者明白了吧?B包的测试函数无法读取A包People的构造方法。
同理,如果是People的子类,能不能访问到 protected权限的构造方法呢?
我们在A包下,创建一个Student学生类,继承自People父类。代码如下所示
package cn.ypc;
public class Student extends People{
protected Student(String name, int age) {
super(name, age);
}
}
接着在A包的测试类中,进行对Student学生类的实例化。
package cn.ypc;
public class Main {
public static void main(String[] args) {
Student student = new Student("ZWZ01",18);
}
}
可以正常输出!
总结:只对子类,或者同一包下的类公开构造方法。(注意子类并不一定在一个包下)
现在People类创建在A包下,我们在B包下创建一个People的子类——Student类。
翻译一下,就是 People 类没有默认的构造方法,必须要自己定义一个构造方法
当我们自动填写父类的构造方法的时候,IDE又报错了,类似之前的错误,也是构造方法找不到的问题。
所以,可以得出结论:在系统默认的访问权限下,对同一个包公开,对不同包不公开。
总结:系统默认情况下,只对同一包下的类公开构造方法。
系统默认与protected不同的是,如果其子类不在同一包下,那么这个子类就不能访问父类的构造方法。
如果我们把A包的People类构造方法改为private私有
package cn.ypc;
public class People {
String name;
int age;
private People(String name,int age){
this.name = name;
this.age = age;
System.out.println("姓名 = " + this.name + ", 年龄 = " + this.age);
}
}
看!首先是本包下的子类引用父类的构造方法,就报错了,说是找不到构造方法
接着是本包下的测试类调用People的构造方法,也不行!
那么如果是别的包下的测试类,那也一样找不到构造方法。
总结:如果被private修饰,那么这个构造方法只能被自己所用,不能被其他类所调用。
1.构造方法:就是在我们实例化类的时候,给类的指定变量赋值、执行指定方法。
2.public:使用public修饰访问权限,所有类都可以访问到此构造方法。
3.protected:只对子类,或者同一包下的类公开构造方法。(注意子类并不一定在一个包下)
4.系统默认:与protected不同的是,如果其子类不在同一包下,那么这个子类就不能访问父类的构造方法。
5.private:如果被private修饰,那么这个构造方法只能被自己所用,不能被其他类所调用。
Java的成员变量、成员方法、构造方法的访问级别可以是上面的任意一个,一般使用 public (公开)和 private (私有)会比较多。
文章浏览阅读170次。@IT程序猿 微博网友评论:@余音袅袅Lena:还有老师站后面看着改bug@月小夕__:我司程序员深有体会@倉優小子:设计师应该感受更深吧@梦中醒不过来:别的架构师 vs..._一编程室友就在旁边看
文章浏览阅读151次。原文地址:https://www.linuxidc.com/Linux/2018-07/153129.htminit是Linux系统操作中不可缺少的程序之一。init进程,它是一个由内核启动的用户级进程。内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。..._linux的几个运行级别运行界面截图
文章浏览阅读1.5w次,点赞9次,收藏26次。解决 idea maven依赖引入失效,无法正常导入依赖问题idea是真的好用,不过里面的maven依赖问题有时候还真挺让人头疼,不少小伙伴也许会遇到刚配好不久的maven突然就无法正常导入依赖了,或者正满怀激情地看着教学视频想跟着敲一波代码,最后却因依赖无法导入而激情湮灭;又或者开发了挺久的项目哪天敲着敲着代码就一片爆红,一顿猛操作却发现是依赖失效了!又或者诸如…等等。关键是最后试了下网上常用的套路:1.右键 pom.xml -> maven -> reimport;2.File -&g_idea maven失效
文章浏览阅读1k次。import mathimport randomfrom random import sampleimport numpy as npfrom numpy import *import geatpy as eaimport xlrd##已知数据q1='F:\共享车选址调度\共享汽车数据\候选点之间的OD(13).xlsx'T1='F:\共享车选址调度\共享汽车数据\候选点之间的..._遗传算法中最优个体是什么
文章浏览阅读1.1k次。先来看一下微信支付的流程,可见在整个支付流程中后台需要处理的事情有:1、调用统一下单api2、生成JSAPI页面调用的支付参数,并请求支付3、异步通知商户支付结果4、返回微信异步通知的处理结果下面来实际编程实现以上的过程,这里面我们使用了第三方Sdk,best-pay-sdkhttps://github.com/Pay-Group/best-pay-sdkmaven引入依赖 ..._cn.springboot.bestpay
文章浏览阅读317次。ESP8266开发环境搭建_安信可ide1.5
文章浏览阅读259次。git错误:fatal: unable to access 'https://github.com/baidu/amis.git/': OpenSSL SSL_read: Connection was reset, errno 10054产生原因:一般是这是因为服务器的SSL证书没有经过第三方机构的签署,所以才报错解决办法:解除ssl验证后,再次git即可 git config --global http.sslVerify "false"...
文章浏览阅读3.2k次。1.加入相关依赖: packaging>presto-plugin</packaging> <!--设置presto版本--> <properties> <presto.verison>0.208</presto.verison> </propertie..._presto调用聚合函数的步骤
文章浏览阅读3.3k次,点赞11次,收藏6次。容器退出后,通过 docker container ls 命令查看不到,数据会丢失么?如何停止所有正在运行的容器?如何批量清理已经停止的容器?如何获取某个容器的 PID 信息?如何给容器指定一个固定 IP 地址?如何临时退出一个正在交互的容器的终端,而不终止它?使用 docker port 命令映射容器的端口时,系统报错“Error: No public port ‘80’ published for xxx”?_docker container run停止以后容器消失
文章浏览阅读10w+次,点赞28次,收藏41次。花了4个小时就为装这个玩样,终于解决了,真的又气又兴奋(笑死)。不知道是版本问题还是什么,我在自己电脑上使用pip install SciencePlots安装,只能安装1.0.1版本,但是这个版本根本没有效果,用不了。然后我又使用手动安装si在了一个细节上,坑太多了。我的开发环境:Anaconda python3.6官方地址(其实SciencePlots是matplotlib样式包,是给定了几个学术作图的样式)SciencePlots · PyPIFormat Matplotlib_scienceplots安装
文章浏览阅读2.3k次。数据预处理是指在对数据进行数据挖掘之前,先对原始数据进行必要的清洗、集成、转换、离散和规约等一系列的处理工作,已达到挖掘算法进行知识获取研究所要求的最低规范和标准。通常数据预处理包括:数据清洗、数据集成、数据变换、数据规约。一:数据清洗数据清洗是填充缺失数据、消除噪声数据等操作,主要通过分析“脏数据”的产生原因和存在形式,利用现有的数据挖掘手段和方法去清洗“脏数据”,将“脏数据”转化为满足数据质量..._python数据预处理
文章浏览阅读96次。原标题:机型正式确认,鸿蒙OS 2.0第一批名单曝光!花粉:华为不够厚道最新消息:华为的鸿蒙OS2.0暂定在12月18日开放Beta测试版本,明年一二月份将面向部分手机用户提供升级渠道(机型下方公布),与此同时,华为方面表示,市面上百分之九十的华为机型都可以升级鸿蒙。 鸿蒙姗姗来迟从去年开始,中国的手机用户就在期待华为自家的手机操作系统,鸿蒙OS已经不只是简简单单的代表一个自研的操作系统了,它更..._鸿蒙开放批次