- 后绑定: |
1.术语“多态性”可以理解为“有许多形式”,一个“多态性引用”是可以在不同时间指向不同类型对象的引用变量。利用多态性调用的方法能够由一个调用改变为另一个调用。
2.在多数情况下,绑定发生在编译阶段,但对于多态性引用,这种绑定要延迟到程序运行时才能执行。
3.后绑定的效率低于编译阶段绑定效率,因为后绑定需要在程序执行期间决定所要绑定的定义方法。
4.在Java中,可以用两种方式建立多态性引用:继承方式和接口方式。
- 由继承实现多态性: |
1.一个引用变量可以指向有继承关系的任何类的任何对象。
2.一个object引用可以指向任何对象,因为所有类归根结底都是object类的后代类。
3.实际将调用的方法版本取决于对象的类型而不是引用变量的类型。
4.多态性的实质是,每个类很清楚自己如何完成一个指定的行为,并从某种意义来讲,每个类的行为是相同的。多态机制允许用具有一致性但又独特的方式处理类似的对象。
- 利用接口实现多态性: |
- 排序: |
1.排序是将一组元素调整为有序排列的过程。
2.选择排序法:选择法排序算法通过相继地将各值放在自己的最终位置(排序后的位置)来实现数值的有序排列。以多态性方式实现的排序算法可对任何一组可比较的对象排序。
图片QN
3.插入法排序:插入排序法是不断的将一个新元素插入到已经安排好序的数列子集中。在每一轮排序中,将一个未排序的新元素插入到已排序子集中的适当位置,直到整个数列有序排列为止。
图片5E
- 搜索: |
1.搜索分为线性搜索和二分搜索
2.线性搜索:即从搜索池的起点开始,将目标依次与每个元素进行比较,最终找到目标元素,或搜索到数列的终点后发现数列中不存在目标元素。这里列一下代码的编写:
public class LSearch
{
public static int[] Data = { 12, 76, 29, 22, 15, 62, 29, 58, 35, 67, 58,
33, 28, 89, 90, 28, 64, 48, 20, 77 }; // 输入数据数组
public static int Counter = 1; // 查找次数计数变量
public static void main(String args[])
{
int KeyValue = 22;
// 调用线性查找
if (Linear_Search((int) KeyValue))
{
// 输出查找次数
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 输出没有找到数据
System.out.println("");
System.out.println("No Found!!");
}
}
// ---------------------------------------------------
// 顺序查找
// ---------------------------------------------------
public static boolean Linear_Search(int Key)
{
int i; // 数据索引计数变量
for (i = 0; i < 20; i++)
{
// 输出数据
System.out.print("[" + (int) Data[i] + "]");
// 查找到数据时
if ((int) Key == (int) Data[i])
return true; // 传回true
Counter++; // 计数器递增
}
return false; // 传回false
}
}
运行结果:
[12][76][29][22] Search Time = 4
3.二分搜索:前提是数列必须是已经排序好的,搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。下面是其代码(以升序的数列为例):
public class BSearch
{
public static int Max = 20;
public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58,
63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 数据数组
public static int Counter = 1; // 计数器
public static void main(String args[])
{
int KeyValue = 22;
// 调用折半查找
if (BinarySearch((int) KeyValue))
{
// 输出查找次数
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 输出没有找到数据
System.out.println("");
System.out.println("No Found!!");
}
}
// ---------------------------------------------------
// 折半查找法
// ---------------------------------------------------
public static boolean BinarySearch(int KeyValue)
{
int Left; // 左边界变量
int Right; // 右边界变量
int Middle; // 中位数变量
Left = 0;
Right = Max - 1;
while (Left <= Right)
{
Middle = (Left + Right) / 2;
if (KeyValue < Data[Middle]) // 欲查找值较小
Right = Middle - 1; // 查找前半段
// 欲查找值较大
else if (KeyValue > Data[Middle])
Left = Middle + 1; // 查找后半段
// 查找到数据
else if (KeyValue == Data[Middle])
{
System.out.println("Data[" + Middle + "] = " + Data[Middle]);
return true;
}
Counter++;
}
return false;
}
}
运行结果:
Data[3] = 22
Search Time = 5
1: 什么是权限修饰符,他有什么作用,为什么需要他;
一个Java应用有很多类,但是有些类,并不希望被其他类使用。每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用。如何能做到访问控制呢?就需要使用访问权限修饰符。
1.权限修饰符就是用于控制被修饰变量、方法、类的可见范围.也就是其作用范围; |
2:java中权限修饰符包括4种:
1.公共类型 public ; 2.public可以修饰类,成员变量,构造方法,方法成员。 3.被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包, 4.是权限最大的一个修饰符 |
1.私有类型 private; 2.可以修饰成员变量,构造方法,成员方法,不能修饰类(此处指外部类,不考虑内部类)。 3.被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。 |
1.默认类型 default; 2.可用于修饰类,成员变量,构造方法,方法,都能够使用默认权限,即不写任何关键字。 3.默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。 |
1.保护类型 protect; 2.可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。 3.被protected修饰的成员,能在定义它们的类中,同包的类中被调用。 4.如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。 |
图片:
3: 关于权限修饰符还要注意几个问题;
1.并不是每个修饰符都可以修饰类(指外部类),只有public和default可以。 2.所有修饰符都可以修饰数据成员,方法成员,构造方法。 3.为了代码安全起见,修饰符不要尽量使用权限大的,而是适用即可。比如,数据成员,如果没有特殊需要,尽可能用private。加强封装性; 4.修饰符修饰的是“被访问”的权限。 |
this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。this的用法在java中大体可以分为3种:
|
super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。super也有三种用法:
|
super和this的异同: super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名) 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。 super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。 super()和this()均需放在构造方法内第一行。 尽管可以用this调用一个构造器,但却不能调用两个。 this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。 this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。 |
James Gosling在1995年2月发表了一篇名为”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。
Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管Java仍旧保留方法的重载),多重继承(multiple inheritance),以及广泛的自动强迫同型(extensive automatic coercions)。 |
Java: 一种简单的,面向对象的,分布式的,解释型的(译者注:Java既不是纯解释型也不是纯编译型的语言),健壮的,安全的,架构中立的,可移植的,高性能的,支持多线程的,动态语言。 |
为了强化简单这个特点,这就是我们去除多重继承的原因。下面来看个例子,多重继承的菱形继承问题。
tupian
有两个类B和C继承自A。假设B和C都继承了A的方法并且进行了覆盖,编写了自己的实现。假设D通过多重继承继承了B和C,那么D应该继承B和C的重载方法,那么它应该继承哪个的呢?是B的还是C的呢?
C++中经常会掉入这个陷阱,虽然它也提出了替代的方法来解决这个问题。我们在Java中就不会出现这个问题。就算两个接口拥有同样的方法,实现的类只会有一个方法,这个方法由实现的类编写。动态的加载类会让多重继承的实现变得困难。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
多态是同一个行为具有多个不同表现形式或形态的能力。多态下允许将子类类型的指针赋值给父类类型的指针。
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
概念很多,嘚仔细看,有很多细节,和前面的章节联系紧密。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 95/95 | 1/1 | 18/18 | |
第二周 | 515/620 | 1/2 | 22/40 | |
第三周 | 290/910 | 1/3 | 20/60 | |
第四周 | 1741/2651 | 1/4 | 30/84 | |
第五周 | 579/3230 | 1/5 | 20/104 | |
第六周 | 599/3829 | 1/6 | 18/122 | |
第七周 | 732/4561 | 1/6 | 24/146 |
计划学习时间:22小时
实际学习时间:24小时
改进情况:稍有点
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
20172327 2017-2018-2 《程序设计与数据结构》第八周学习总结
原文:https://www.cnblogs.com/mrf1209/p/8981520.html