Java02继承

5继承

5.1 类、超类和子类

关键字extends表示继承。

Java中的继承都是公用继承,没有C++中的私有继承和保护继承。

 

Super class  Subclass  来自于集合的术语

Base class   Derived class

Parent class  Child class

 

将通用的功能放在超类中,将具有特殊用途的方法放在子类中。

 

子类中可以覆盖(override)超类中的方法。

子类不能直接访问超类的私有域。

子类中调用超类方法:super.method()

C++中用 [超类名::方法]的方式调用超类方法。

 

因为子类不能访问超类私有域,

子类的构造器中,第一条语句要用super(...)调用超类构造器;

如果未提供super()语句,则调用默认无参数的超类构造器;

如果超类没有默认构造器,则编译出错。

 

C++中利用初始化列表语法调用超类构造器。

 

继承层次:

由一个公共超类派生出来的所有类的集合被称为继承层次(inheritance hierarchy

从某个特定的类到其祖先的路径被称为该类的继承链(inheritance chain

一个祖先类可以拥有多个子孙继承链。

Java不支持多继承。

 

多态:

IS-A规则:子类的每个对象也是超类的对象。

置换法则,程序中出现超类对象的任何地方都可以用子类对象置换。

超类对象变量可以引用任何其子类对象。

不能将超类的引用赋给子类变量。

 

静态绑定 static binding

对于private方法、static方法、final方法或者构造器,编译器可明确知道应该调用哪个方法。

动态绑定:

调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。

虚拟机预先为每个类创建一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。真正调用的时候,虚拟机查找这个表。

 

覆盖一个方法时,子类方法不能低于超类方法的可见性。

 

阻止继承:

Final类:不允许被扩展的类。

Final方法:不允许被重写的方法。

Final类中的方法自动的称为final方法。

Final域:常量。

Final的主要目的:确保它们不会在子类中改变语义。

String类是final类。

 

如果一个方法没有被覆盖并且很短,编译器进行内联(inlining)优化处理。因为分支转移会扰乱指令预取策略。

 

强制类型转换:

用一对圆括号将目标类名括起来,置于需要转换的目标引用之前。

唯一原因:在暂时忽视对象的实际类型之后,使用对象的全部功能。

可以将子类引用赋给超类变量,但当超类引用赋给子类变量时,必须进行类型转换。

在类型转换之前,进行instanceof检查。

综上所述:

1、只能在继承层次内进行类型转换;

2、在将超类转换成子类之前,使用instanceof进行检查。

 

在一般情况下,应该尽量少用类型转换和instanceof运算符。

 

C++的类型转换:Manager* boss = dynamic_cast<Manager*>(staff[1]);

 

抽象类:

包含一个或多个抽象方法的类必须声明为抽象类。

抽象类可以包含具体数据和具体方法。

 

其子类如果实现部分抽象方法,则也需声明为抽象类;

子类若实现全部抽象方法,则不必声明为抽象方法。

 

类即使不包含抽象方法,也可以将其声明为抽象类。

抽象类不能被实例化。

可以定义一个抽象类的对象变量,但是只能引用非抽象子类的对象。

 

C++中的抽象类:只要包含纯虚函数的类就是抽象类。

 

编译器只允许调用在类中声明的方法。

 

受保护访问:

允许子类的方法访问超类的某个域,或希望超类的某些方法被子类访问。

protected

最好的示例:Object类中的clone方法。

 

Private——对本类可见;

Public——对所有类可见;

Protected——对本包和所有子类可见;

默认——对本包可见。

 

5.2 Object:所有类的超类

Object类型的变量可以引用任何类型的对象。

java中,只有基本类型(primitive types)不是对象。

所有数组类型都是对象,扩展于Object类。

 

equals方法:

    public boolean equals( Object other);

Object中,检测两个对象变量是否有相同的引用(功能与==一致)。

在子类定义equals方法时,首先调用超类的equals方法。如果检测失败,对象就不可能相等。如果超类中的域都相等,就需要比较子类中的实例域。

 

Java要求equals语法具有下面的性质:

自反性

对称性

传递性

一致性

X.equals(null)应该返回false

 

重写符号:方法前一行加@override

 

重写equals方法步骤:

1、显式参数命名为otherObject

2、检测thisotherObject是否引用同一个对象;if (this == otherObject) return true;

3、检测otherObject是否为空;if (otherObject == null) return false;

4、检测otherObject是否属于同一类。

a) 如果equals的语义在每个子类中有所改变,用getClass检测:

if (getClass() != otherObject.getClass()) return false;

b) 如果所有的子类都拥有统一语义,就使用instanceof检测:

if (!(otherObject instanceof ClassName)) return false;

5、otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;

6、对所有需要比较的域进行比较。需在其中包含调用super.equals(other);

 

数组类型的域,用Arrays.equals(a1, a2)检查是否相等。

 

hashcode方法:

public int hashcode();

定义在Object类中,每个对象都有一个默认的散列码,其值为对象的存储地址。

Equals方法必须和hashcode方法一致,即如果a.equals(b)为真,则ab的散列码必须相同。

 

Objects.hashCode(Object a); //如果为Null,返回0,否则返回a.hashcode()

Objects.hash(Object... objects); //返回所有对象的散列码组合。

 

数组类型的域,用Arrays.hashCode(a)计算散列码。

 

toString方法

Object类定义了toString()方法,打印输出对象所属的类名和散列码。

绝大多数遵循格式:类的名字[域值]

getClass().getName()获得类的名字。

只要对象与字符串通过 + 相连,就自动调用对象的toString()方法。

System.out.println(x); //自动调用xtoString()方法。

 

数组继承了object类的toString方法。

如果想打印数组的内容,用Arrays.toString(a);多维数组用Arrays.deepToString(a)

 

强烈建议为自定义的每一个类增加toString方法。

 

@SuppressWarnings(“unchecked”)

 

包装器(wrapper)  自动装箱(autoboxing)  自动拆箱

 

5.3 参数数量可变方法

最后一个参数为 类名... args,实际传入一个数组。调用时可以传入多个类对象,甚至一个类数组。


5.4 枚举类

所有枚举类型都是Enum类的子类。

比较时,直接用==

 

5.6 反射

反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序。这项功能被大量地应用于JavaBeans中,它是Java组件的体系结构。

能够分析类能力的程序称为反射(reflective)。

 

在程序运行期间,系统保存了所有已加载类的信息,虚拟机用这些信息选择相应的方法执行。

保存这些信息的类被称为Class


获得类对象的三种方法:

1Object类中的getClass()方法将会返回一个Class类型的实例。

2、还可以通过调用静态方法forName获得类名对应的Class对象。

String className = “java.util.Date”;

Class c1 = Class.forName(className);

当包含main()方法的类被加载时,将会递归加载全部所需类。

一种逐步加载方法,调用Class.forName()手工加载其他类。

3、Class cl1 = Data.class;

 

可以利用==运算符实现两个类对象的比较操作。

 

类对象的newInstance()方法可以快速创建一个类的实例,调用的是默认构造函数。

String s = “java.util.Date”;

Object m = Class.forName(s).newInstance();

 

利用反射分析类的能力:

反射机制最重要的内容——检查类的结构。

java.lang.reflect包中用三个类FieldMethodConstructor分别用于描述类的域、方法和构造函数。

Class类中的getFileds()getMethods()getConstructors()将返回public域、方法、构造器数组,包括超类的公有成员。

Class类中的getDeclareFiels()getDeclaredMehtods()getDeclaredConstructors()返回全部域、方法、构造器数组,不包括超类的公有成员。

 

public class ReflectionTest
{public static void main(String[] args){String name;Scanner in = new Scanner(System.in);System.out.print("Enter class name: ");name = in.next();StringBuilder sb = new StringBuilder();try{Class c1 = Class.forName(name);Class superc1 = c1.getSuperclass();String modifiers =Modifier.toString(c1.getModifiers());if ( modifiers.length() > 0 )sb.append(modifiers + " ");sb.append("class" + name);if (superc1 != null && superc1 != Object.class)sb.append(" extends " + superc1.getName());sb.append("\n{\n");Constructor[]constructors = c1.getDeclaredConstructors();for (Constructor c : constructors){String cname = c.getName();sb.append("\t");String cmodifier =Modifier.toString(c.getModifiers());if (cmodifier.length() != 0)sb.append(cmodifier + " ");sb.append(cname+"(");Class[]cparameters = c.getParameterTypes();for ( int j = 0; j < cparameters.length; j++){if (j > 0)sb.append(",");sb.append(cparameters[j].getName());}sb.append(");\n");}sb.append("\n\n");Method[]methods = c1.getDeclaredMethods();for (Method m : methods){sb.append("\t");String mmodifier =Modifier.toString(m.getModifiers());if (mmodifier.length() != 0)sb.append(mmodifier + " ");String rtype = m.getReturnType().getName();sb.append(rtype + " " + m.getName() + "(");Class[]mparameters = m.getParameterTypes();for (int i = 0; i < mparameters.length; i++){if (i > 0)sb.append(",");sb.append(mparameters[i].getName());}sb.append(")\n");}sb.append("\n\n");Field[]fields = c1.getDeclaredFields();for (Field f : fields){sb.append("\t");String fmodifier =Modifier.toString(f.getModifiers());if( fmodifier.length() !=0 )sb.append(fmodifier + " ");Class type = f.getType();String tname = type.getName();String fname = f.getName();sb.append(tname + " " + fname + ";\n");}sb.append("}");System.out.println(sb);}catch(ClassNotFoundException e){e.printStackTrace();}}
}


利用反射机制查看域值:

f.setAcessible(true);

f.get(obj);

利用反射机制修改域值:

f.get(obj, value);

 

编写一个可供任意类使用的通用toString方法:

1、使用getDeclaredFileds获得所有数据域;

2、使用setAccessible将所有的域设置为可访问的;

3、对每个域,获得名字和值。

 

setAccessible方法是AccessibleObject类中的一个方法,是FiledMethodConstructor类的公共超类。

 

Method对象的invoke方法,允许调用包装在当前Method对象中的方法。

方法签名:

Object invoke(Object obj, Object... args);

第一个参数为具体对象,其余为这个方法的参数。

对于静态方法,第一个参数设置为NULL

Invoke的参数和返回值必须是Object类型的。

使用反射获得方法指针的代码要比仅仅直接调用方法明显慢一些。

 

5.7 继承设计的技巧

1、将公共操作和域放在超类;

2、不要使用受保护的域;

3、使用继承体现IS-A关系;

4、除非所有继承的方法都有意义,否则不要使用继承;

5、在覆盖原方法时,不要改变预期的行为;

6、使用多态;

7、不要过多的使用反射——对编写系统程序及其有用,不适用于应用程序的编写。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BP神经网络与Python实现

人工神经网络是一种经典的机器学习模型&#xff0c;随着深度学习的发展神经网络模型日益完善.联想大家熟悉的回归问题&#xff0c; 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数&#xff0c; 并使用该函数进行预测&#xff0c; 网络的训练过程即为调节该…

《关于长沙.NET技术社区未来发展规划》问卷调查结果公布

那些开发者们对于社区的美好期待 2月&#xff0c;长沙.net 技术社区自从把群拉起来开始&#xff0c;做了一次比较正式、题目为《关于长沙.NET技术社区未来发展规划》的问卷调查&#xff0c;在问卷调查中&#xff0c;溪源写道&#xff1a; 随着互联网时代的到来&#xff0c;互联…

Java03接口与内部类

6 接口与内部类 接口 interface 对象克隆 内部类 inner class 代理 proxy 6.1 接口 public interface Comparable<T> {int compareTo(T other); }Arrays.sort(Object[] a) 利用的是mergesort 接口也可以被扩展 public interface Moveable {void move(double x, doub…

第一节:ASP.NET开发环境配置

第一节&#xff1a;ASP.NET开发环境配置 什么是ASP.NET&#xff0c;学这个可以做什么&#xff0c;学习这些有什么内容&#xff1f; ASP.NET是微软公司推出的WEB开发技术。 2002年&#xff0c;推出第一个版本&#xff0c;先后推出ASP.NET2.0&#xff0c;和ASP.NET3.5&#xff0c…

深度学习笔记之win7下TensorFlow的安装

最近要学习神经网络相关的内容&#xff0c;所以需要安装TensorFlow。不得不说&#xff0c;安装TensorFlow的感受就像是大一刚入学学习C语言时&#xff0c;安装vs时一样&#xff0c;问题一大堆&#xff0c;工具都装不好&#xff0c;还学啥呀。好在&#xff0c;就在昨晚&#xff…

Java04异常、断言、日志和调试

11 异常、断言、日志和调试 异常处理&#xff08;exception handing&#xff09; 使用断言来启动检测 Java日志框架 调试技巧 11.1 处理错误 如果一个方法不能够采用正常的途径完成任务&#xff0c;就通过另外一个路径退出方法。 在这种情况下&#xff0c;方法不返回任何…

全双工与半双工的区别

1、全双工传输 (英文Full&#xff0d;Duplex &#xff09; 是指交换机在发送数据的同时也能够接收数据&#xff0c;两者同步进行&#xff0c;这好像我们平时打电话一样&#xff0c;说话的同时也能够听到对方的声音。目前的交换机都支持全双工。全双工的好处在于迟延小&#xff…

人脸识别经典算法一:特征脸方法(Eigenface)

这篇文章是撸主要介绍人脸识别经典方法的第一篇&#xff0c;后续会有其他方法更新。特征脸方法基本是将人脸识别推向真正可用的第一种方法&#xff0c;了解一下还是很有必要的。特征脸用到的理论基础PCA在另一篇博客里&#xff1a;特征脸(Eigenface)理论基础-PCA(主成分分析法)…

Java05泛型

12 泛型 12.1 为什么使用泛型 泛型程序设计&#xff08;Generic programming&#xff09;&#xff1a;意味着编写的代码可以被很多不同类型的对象所重用。 类型参数&#xff08;type parameters&#xff09; 通配符类型&#xff08;wildcard type&#xff09; 可以将Manage…

bitmap转换为drawable

Bitmap bitmap MediaStore.Images.Media.getBitmap(this, Uri.parse(string)); Drawable drawable new BitmapDrawable(bitmap);// 这样就转换成drawable格式&#xff0c;可以设置背景图片了转载于:https://www.cnblogs.com/Nigeria/p/10471028.html

numpy的下载与安装教程——(解决No module named numpy问题)

NumPy函数库是Python开发环境的一个独立模块&#xff0c;而且大多数Python发行版没有默认安装NumPy数据库&#xff0c;因此在安装Python之后必须单独安装NumPy数据库。 进入Python shell开发环境后输入 [python] view plaincopy from numpy import* 如果出现No module named …

Xception

The First ColumnThe Second Columnpadding 方式&#xff1a;same and valid The First ColumnThe Second ColumnSame 就是 增加一列相同的数 &#xff08;一般是0&#xff09;valid只保留有效的转载于:https://www.cnblogs.com/hugeng007/p/10477430.html

1.苍穹外卖-day01

苍穹外卖-day01 课程内容 软件开发整体介绍 苍穹外卖项目介绍 开发环境搭建 导入接口文档 Swagger 项目整体效果展示&#xff1a; 管理端-外卖商家使用 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一名…

7 用户和用户组

7.1 用户配置文件 7.1.1 用户信息文件 /etc/passwd man 5 passwd 查看配置文件功能 第1字段&#xff1a; 用户名称 第2字段&#xff1a; 密码标志 X代表有密码 如果用户没有密码&#xff0c;则只允许本地登录 第3字段&#xff1a; UID&#xff08;用户ID&#xff09; 0…

C#调用Python模块

编程&#xff1a;C#调用Python模块 当下&#xff0c;C#与Python都是比较热门的计算机编程语言&#xff0c;他们各有优缺点&#xff0c;如果能让他们互相配合工作&#xff0c;那是多么美好的事情&#xff0c;今天我来讲解一下如何利用C#来调用Python。 如果让C#支持调用Python模…

面试简单整理之克隆

61.为什么要使用克隆&#xff1f; 克隆获取对象的副本&#xff0c;直接用复制还是一个引用。 62.如何实现对象克隆&#xff1f; 1.被clone的类实现cloneable接口&#xff0c;重写object类的clone&#xff08;&#xff09;方法 2.如果深克隆则克隆对象的引用对象也要实现接口、重…

8 权限管理

8.1 ACL权限 8.1.1 简介与开启 用于解决身份不够用的问题 ACL(access control list) 访问控制表 ACL是存在于计算机中的一张表&#xff0c;它使操作系统明白每个用户对特定系统对象&#xff0c;例如文件目录或单个文件的存取权限。 这张表对于每个系统用户有拥有一个访问…

windows下GitHub的SSH Key 配置

https://www.jianshu.com/p/9317a927e844转载于:https://www.cnblogs.com/lishidefengchen/p/10481889.html

PyCharm调试错误

JetBrains PyCharm 2017.3.2 这就说明python.exe的环境没有配&#xff0c;点击蓝色的configure Python Interpreter&#xff0c;然后选择对应的路径就可以了

Java06集合

13 集合 实现方法时&#xff0c;不同的数据结构会导致性能有很大差异。 13.1 集合接口 Java集合类库将接口&#xff08;interface&#xff09;与实现&#xff08;implementation&#xff09;分离。 可以使用接口类型存放集合的应用&#xff0c;一旦改变了想法&#xff0c;可…