Java_Day4(上)
Java learning_Day3(上)
本人学习视频用的是马士兵的,也在这里献上
<链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA>
提取码:fobs
内容
- 继承与权限控制
- 访问控制
- 方法的重写
- 关键字 super
- 继承中的构造方法
继承与权限控制
- Java中使用 extends 关键字实现类的继承机制,其语法规则为:
<modifier> class <name> [extends <superclass>] {
... ...
}
- 通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。
- Java只支持单继承,不允许多重继承:一个子类只能有一个基类,一个基类可以派生出多个子类。
观察下面代码
class Person {
private String name;
private int age;
public void setName(String name) {
this.name=name;
}
public void setAge(int age) {
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
class Student extends Person {
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school =school;
}
}
public class TestPerson {
public static void main(String arg[]){
Student student = new Student();
student.setName("John");
student.setAge(18);
student.setSchool("SCH");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getSchool());
}
}
在上述程序中,由于类Student继承了类 Personl,因而可以直接调用父类的所有方法而不需要重新定义方法。
访问控制
- Java权限修饰符 public protected private置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。
| 修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
|---|---|---|---|---|
| private | √ | - | - | - |
| default | √ | √ | - | - |
| protected | √ | √ | √ | - |
| public | √ | √ | √ | √ |
- 对于 class 的权限修饰只可以用public和 default。
方法的重写
- 在子类中可以根据需要对从基类中继承来的方法进行重写。
- 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
- 重写方法不能使用比被重写方法更严格的访问权限。
观察下面代码
class Person {
private String name;
private int age;
public void setName(String name) {
this.name=name;
}
public void setAge(int age) {
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String getInfo() {
return "Name: "+ name + "\n" +"age: "+ age;
}
}
class Student extends Person {
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school =school;
}
public String getInfo() {
return "Name: "+ getName() + "\nage: "+ getAge() + "\nschool: "+ school;
}
}
public class TestOverWrite {
public static void main(String arg[]) {
Student student = new Student();
Person person = new Person();
person.setName("none");
person.setAge(1000);
student.setName("John");
student.setAge(18);
student.setSchool("SCH");
System.out.println(person.getInfo());
System.out.println(student.getInfo());
}
}
上述程序中,类 Student 重写了父类 Person 的 getInfo 方法,在 main 中调用的是子类重写父类后的方法。
另外,在重写方法时,可以在重写的方法前添加 @Override ,告诉编译器此处是重写方法,仍以上述代码为例
@Override
public String getInfo() {
return "Name: "+ getName() + "\nage: "+ getAge() + "\nschool: "+ school;
}
@Override 是伪代码,可以不加上,但是加上有如下好处:
- 可以当注释用,方便阅读;
- 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,将上面代码段写错
@Override
public String GetInfo() { //方法名注意大小写变化
return "Name: "+ getName() + "\nage: "+ getAge() + "\nschool: "+ school;
}
此时编译器会视为你的方法重写出错,将会报错:
错误: 方法不会覆盖或实现超类型的方法
而不添加 @Override 的程序段将被编译器视为子类特有的方法,编译会通过。
关键字 super
在Java类中使用super来引用基类的成分
观察下面代码
class FatherClass {
public int value;
public void f() {
value = 100;
System.out.println("FatherClass.value="+value);
}
}
class ChildClass extends FatherClass {
public int value;
public void f() {
super.f();
value = 200;
System.out.println("ChildClass.value="+value);
System.out.println(value);
System.out.println(super.value);
}
}
public class TestInherit {
public static void main(String[] args) {
ChildClass cc = new ChildClass();
cc.f();
}
}
输出
FatherClass.value=100
ChildClass.value=200
200
100
在上述代码中,子类 ChildClass 通过 super.f() 调用父类的方法,在父类方法执行完成后,继续执行子类方法剩余的代码段。
继承中的构造方法
- 子类的构造的过程中必须调用其基类的构造方法。
- 子类可以在自己的构造方法中使用 super(argument_list) 调用基类的构造方法。
- 如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法。
- 另外,可以使用 this(arguement_list)调用本类的另外的构造方法。
- 如果调用 super,必须写在子类构造方法的第一行。
- 如果子类构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法。
- 如果子类构造方法中既没有显示调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。
观察下面代码
class Bike {
String brand;
public Bike() {
System.out.println("父类中无参的构造器被调用了");
}
public Bike(String brand) {
this.brand = brand;
System.out.println("父类中" + brand + "牌构造器被调用了");
}
}
public class Aceing extends Bike{
public Aceing() {
System.out.println("子类中无参的构造器调用了");
}
public Aceing(String brand) {
super(brand);
System.out.println("子类中" + brand + "牌构造器被调用了");
}
public static void main(String[] args) {
Aceing a1 = new Aceing();
Aceing a2 = new Aceing("Giant");
}
}
输出
父类中无参的构造器被调用了
子类中无参的构造器调用了
父类中Giant牌构造器被调用了
子类中Giant牌构造器被调用了
在语句 Aceing a1 = new Aceing(); 中,调用了子类对象 a1 的 Aceing() 构造方法,而该方法中没有显示地调用父类 Bike 的构造方法,故系统默认调用父类无参数的 Bike() 构造方法,输出 父类中无参的构造器被调用了 ,紧接着继续执行子类的构造方法,输出 子类中无参的构造器调用了
在语句 Aceing a2 = new Aceing("Giant"); 中,调用了子类对象 a2的 Aceing(String brand) 构造方法,而构造方法中调用了父类的 Bike(String brand) 方法, 输出 父类中Giant牌构造器被调用了 ,紧接着继续执行子类的构造方法,输出 子类中Giant牌构造器被调用了
参考资料
Java中@Override的作用|博客园
https://www.cnblogs.com/scown/p/5374691.html
Java_Day4(上)的更多相关文章
- JavaDay3(上)
Java learning_Day3(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...
- Asp.Net Mvc 使用WebUploader 多图片上传
来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...
- [APUE]进程控制(上)
一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
- PHP搭建大文件切割分块上传功能
背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- jquery.uploadify文件上传组件
1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...
- 在传统.NET Framework 上运行ASP.NET Core项目
新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...
- .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布
众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...
随机推荐
- HTML页面缓存
引出问题: 在做完一个项目迭代上线的时候遇到一个问题:Ht代码部署在nginx里面,当我打包的H5代码上传把之前代码替换掉之后,如果手机端之前有打开过相关的页面,那么在代码上传成功后再次打开,回出现一 ...
- OptaPlanner 7.32.0.Final版本彩蛋 - SolverManager之批量求解
上一篇介绍了OptaPlanner 7.32.0.Final版本中的SolverManager接口可以实现异步求解功能.本篇将继续介绍SolverManager的另一大特性 - 批量求解. 适用场景 ...
- 远程连接Linux下mysql报10061
最近接到一个新活,四台Linux服务器配置MySQL热机双备+IP隧道LVS集群服务,尽管好想使个眼神杀死老大,但特么心里是感激的.不多说一口气装了n个Ubuntu-server. 每次在虚拟机装完M ...
- lua学习之深入函数第二篇
深入函数 2 非全局的函数 函数是第一类值,函数可以存储到全局变量,局部变量,table 字段中 lua 函数库中的大部分函数存储到 table 字段中 Lib = {} Lib.foo = func ...
- 分享下超实用的用skura frp做内网穿透的经验
操作目的: 使无公网ip的主机能被外网访问,实现ssh对服务器的远程管理 硬件准备: 1.服务端:skura frp主机(skura frp 免费提供,有待创建) 2.客户端:接在无线路由器(内网)上 ...
- ELK学习002:Elasticsearch 7.x 的安装及配置
Elasticsearch 的安装与启动 1.1 下载 Elasticsearch 7.6.0 下载地址:https://www.elastic.co/cn/downloads/elasticsear ...
- 在视觉可视化中如何使用ScaleBreaks-比例中断
从lightningChart V8开始,这项图表控件产品开始支持X轴的Scale break功能. 这个功能的主要作用是排除选定的X轴范围,例如互动交易时间/日期或者机器停产时间等.如果有一部分的数 ...
- mysql必知必会--检 索 数 据
SELECT 语句 SQL语句是由简单的英语单词构成的.这些单词称 为关键字,每个SQL语句都是由一个或多个关键字构成的.大概,最经常 使用的SQL语句就是 SELECT 语句了.它的用途是从一个或多 ...
- CF1311E Construct the Binary Tree
膜这场比赛的 \(rk1\) \(\color{black}A\color{red}{lex\_Wei}\) 这题应该是这场比赛最难的题了 容易发现,二叉树的下一层不会超过这一层的 \(2\) 倍,所 ...
- Android实战项目——家庭记账本(四)
今天是开发的第四天,完成的主要内容如下: 1.账单查询功能的完善以及查询结果的显示和编辑 2.侧边栏布局的实现 3.首页fragment中本月与上月对比账目情况 实现的效果如图: 已添加的账单内容以及 ...