Java基础知识陷阱(四)
本文发表于本人博客。
今天我们来说说关于java继承以及反射有关的问题,大家先看下下面代码,试问可以编译通过不,为什么具体说说原因?
public class Test{
public static void main(String[] args){
Person p = new Man();
p.talk();
}
}
class Person{
public void talk() throw NullPointerException{
System.out.println("Person is talking");
}
}
class Man extends Person{
protected void talk() throw Exception{
System.out.println("Man is talking");
}
}
如果平时多留意的话估计这个问题显而易见了是存在问题的,这个是提问关于继承中Override父类的方法。
我 们知道要想实现override必须要返回类型,方法名称,参数列表一致才能符合是override,但是这其中还有一些规则需要注意,比如访问级别、异 常抛出。上面的代码是无法编译通过的,其中存在2个问题:一是子类重写父类方法的时候访问级别必须是大于等于父类的访问的级别;二是子类重写父类方法的时 候异常范围必须是小于等于父类异常的范围。上面的代码稍微修改下就可以了,把protected改成public,异常Eception改成 NullPointerException这样就符合了编译就通过了!当然也可以稍微改下(反过来)代码如下:
class Person{
protected void talk() throws Exception{
System.out.println("Person is talking");
}
}
class Man extends Person{
public void talk() throws NullPointerException{
System.out.println("Man is talking");
}
}
子类的talk方法的访问级别public大于等于父类talk方法的访问级别,子类的talk方法的异常NullPointerException小于等于父类talk方法的异常Exception。
下面来问问可以修改下面Demo类中的name成员吗,可以的话用什么方法来实现?
class Demo{
private String name = "hello";
public int age ;
public String GetName(){
return name;
}
public int GetAge(){
return age;
}
}
这 个问题大家知道其实就是问的反射,在java里面类中的所有成员包括public、private在反射面前都是可以无效的,是不是觉得这个反射太强大了 啊!我们可以使用以下方法来实现修改字段:1.通过类的.class的语法;2.通过类对象的getClass()方法;3.通过Class对象的 forName()方法。
看代码name字段是属于私有的字段,那么我们看使用getField()方法吗,查看下jdk帮助文档就可以得出它只是返回的public成员并不能返 回私有的,那私有的怎么得到这时我们可以使用getDeclaredField()方法不过要记住,要用setAccessible(true)修改其访 问属性不然是报错的,现在看看下面代码我们怎么来修改私有字段和公有字段的:
public static void main(String[] args) throws Exception {
Demo d = new Demo();
Class<?> cl = Demo.class;
//这个是可以返回私有,getField(name)只是public成员
Field namefield = cl.getDeclaredField("name");
//不要忘记修改其访问属性
namefield.setAccessible(true);
namefield.set(d,"world");
Field agefield = cl.getField("age");
agefield.set(d,30);
System.out.println(d.GetName());
System.out.println(d.GetAge());
}
我们执行代码,就可以看到输出的结果了是我们预期的了。
world
30
这次先到这里。坚持记录点点滴滴!
Java基础知识陷阱(四)的更多相关文章
- Java基础知识陷阱系列
Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...
- Java基础知识陷阱(九)
本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...
- java 基础知识(四)
自己写一个简单的Map 清浅池塘 程序员,专栏:Java那些事儿唯一作者,咨询前请先点详细资料 130 人赞同了该文章 许多许多年以前,在自学Java的时候,笔者曾经写过一个简单的Map,当年很有 ...
- Java基础知识陷阱(十)
本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...
- java基础知识(四)java内存机制
Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...
- Java 基础知识总结 (四、String)
四.String public final class String extends Object implements Serializable, Comparable<String>, ...
- java基础知识拾遗(四)
1.Runnable对象 启动线程:(new Thread(new MyRunnable()).start() 2.jsp中<%@ page language="java" ...
- Java基础知识陷阱(二)
本文发表于本人博客. 上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参.先看下面代码: public void changeInt(int a){ a = ; } ...
- 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)
1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则) * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...
随机推荐
- 数据库面试题之PL/SQL面试题
create table employee( id ) not null, -- 员工工号 salary ,) not null, -- 薪水 name ) not null -- 姓名 ); 第一题 ...
- string类(二、常用string函数)
常用string相关,参至System.String类: 1/ string.Length a.Length字符串长度 string a="a5"; //a.Length==2 s ...
- Windows下安装Apache 2.2.21图文教程
https://www.jb51.net/article/52086.htm 本文详细介绍了在Windows平台上安装Apache的过程,希望对初次安装Apache的朋友有所帮助. 1. 软件准备 我 ...
- Hibernate_day04--HQL查询
HQL查询 1 hql:hibernate query language,hibernate提供一种查询语言,hql语言和普通sql很相似,区别:普通sql操作数据库表和字段,hql操作实体类和属性 ...
- C++ enum 枚举类型
1. 枚举类型浅谈 假设我们要设计一个打开文件的函数, 打开文件由三种状态: input, output 和 append. 不使用枚举, 我们可能会写出如下的代码 const int input = ...
- .NET开发过程中的全文索引使用技巧之Solr
前言:相信许多人都听说过.net开发过程中基于Lucene.net实现的全文索引,而Solr是一个高性能,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查 ...
- 追踪溯源--抓住隐藏在NAT后面的罪犯
零.绪论: 水一篇,很小,只是一点思路记录,在工作中经常遇到的一类小问题.NAT后面的地址如何追查下去,推动网络整改不现实,总还要有一些手段来确认. 一.背景: 全球IPv4地址越来越少,也越来越贵, ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- 【BZOJ4518】[Sdoi2016]征途 斜率优化
[BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...
- [Gradle] 如何强制 Gradle 重新下载项目的依赖库
强制刷新 Gradle 依赖库缓存 $ gradle build --refresh-dependencies The --refresh-dependencies option tells Grad ...