本文发表于本人博客

今天我们来说说关于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基础知识陷阱(四)的更多相关文章

  1. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  2. Java基础知识陷阱(九)

    本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...

  3. java 基础知识(四)

    自己写一个简单的Map 清浅池塘 程序员,专栏:Java那些事儿唯一作者,咨询前请先点详细资料   130 人赞同了该文章 许多许多年以前,在自学Java的时候,笔者曾经写过一个简单的Map,当年很有 ...

  4. Java基础知识陷阱(十)

    本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...

  5. java基础知识(四)java内存机制

    Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...

  6. Java 基础知识总结 (四、String)

    四.String public final class String extends Object implements Serializable, Comparable<String>, ...

  7. java基础知识拾遗(四)

    1.Runnable对象 启动线程:(new Thread(new MyRunnable()).start() 2.jsp中<%@ page language="java" ...

  8. Java基础知识陷阱(二)

    本文发表于本人博客. 上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参.先看下面代码: public void changeInt(int a){ a = ; } ...

  9. 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)

    1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则)     * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...

随机推荐

  1. Web设计的速查卡(转)

    一.排版 1.VisiBone Font Card Download: GIF 2.常用字体表 (HTML) 3.混合字体 (PDF) 二.单元/尺寸 1.Points 和Pixels近似转换表 (H ...

  2. php 文件下载代码

    1.对于一般 $file = "/tmp/dummy.tar.gz"; header("Content-type: application/octet-stream&qu ...

  3. request Dispatch

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  4. Qualcomm Vuforia SDK背景

    参考视频:http://edu.csdn.net/course/detail/1467/23125?auto_start=1 一:概述 官网:www.vuforia.com 应用方向:产品交互.虚拟购 ...

  5. WinFrom 第三方控件 TeleRik控件

    1.首先从工具-拓展与应用中下载安装  TeleRik WinFroms VsExtensions   TeleRik dll文件     2.工具箱控件  将Telerik控件更新过来 3.新建一个 ...

  6. 运维角度浅谈:MySQL数据库优化

    日志君导读: 一个成熟的数据库架构并非一開始设计就具备高可用.高伸缩等特性的.它是随着用户量的添加,基础架构才逐渐完好. 作者:zhenliang8.本文转自51CTO博客,点击原文阅读查看网页版文章 ...

  7. iOS开发之 -- 获取设备的唯一标示符

    各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...

  8. OOXML,XLSX分析

    07以上的xlsx是使用了OOXML和zip,将后缀修改为.zip,就可以看到文件,主要分析xl目录下的文件,如图: 主要数据文件在xl目录下面 styles.xml里面存放着excel的样式数据 很 ...

  9. 使用RODBC连接MySQL数据库(R-3.4.3)

    1.安装RODBC包 install.packages("RODBC") 2.配置ODBC 首先查看是否有mysqlODBC5.1Driver  如果没有mysqlODBC5.1D ...

  10. echart使用总结

    以下参数都是写在option配置对象内,没有提及的配置参数欢迎查阅读echart参考手册. 一. 修改主标题和副标题 title : { text: '未来一周气温变化',//写入主标题 subtex ...