今日计划(已经完成的):
看了一篇图像分割的文献
《疯狂的java讲义》——149~169
阅读笔记:
- 关于多态:
多态是指编译的时候是父类型,运行的时候是子类型,每一个子类型都重写父类型的某个函数a。在运行的时候每个子类型都会执行自己相对性的函数a,这样就实现了多态。
由于编译的时候是父亲类型,所以只能调用父亲的方法,或者是父类型和子类型都有的方法,不能调用子类型有但父类型没有的方法。
对比一下这两个程序的运行结果就有所明白:
package practice;
class base1{
//准备一个方法
public void haha() {
System.out.println("父类型的函数haha");
}
void test(int a) {//会被子类型重写的函数
System.out.println("父类型的test:"+a);
}
}
class base2 extends base1{
void test(int a) {//会被子类型重写的函数
System.out.println("base2子类型的test"+a);
}
}
//函数重载,三种不同的方式
public class base3 extends base1{
void test(int a) {//会被子类型重写的函数
System.out.println("base3子类型的test"+a);
}
public static void main(String[] args) {
base1 b=new base2();
base1 bb=new base3();//创建两个对象
b.test(1);
bb.test(2);
}
}
VS
class base1{
//准备一个方法
public void haha() {
System.out.println("父类型的函数haha");
}
void test(int a) {//会被子类型重写的函数
System.out.println("父类型的test:"+a);
}
}
class base2 extends base1{
void test() {//会被子类型重写的函数
System.out.println("base2子类型的test");
}
}
//函数重载,三种不同的方式
public class base3 extends base1{
void test() {//会被子类型重写的函数
System.out.println("base3子类型的test");
}
public static void main(String[] args) {
base1 b=new base2();
base1 bb=new base3();//创建两个对象
b.test(1);
bb.test(2);
}
}
- 关于实例变量
【代码如下】:
class base1{
public String name="cheng";
//准备一个方法
public void haha() {
System.out.println("父类型的函数haha");
}
void test(int a) {//会被子类型重写的函数
System.out.println("父类型的test:"+a);
}
}
class base2 extends base1{
public String name="yi";
void test() {//会被子类型重写的函数
System.out.println("base2子类型的test");
}
}
//函数重载,三种不同的方式
public class base3 extends base1{
public String name="ming";
void test() {//会被子类型重写的函数
System.out.println("base3子类型的test");
}
public static void main(String[] args) {
base1 b=new base2();
base1 bb=new base3();//创建两个对象
b.test(1);
System.out.println(b.name);
bb.test(2);
System.out.println(bb.name);
}
}
-
引用变量的强制类型转换
也就是说:子类实例可以随时转换成父类实例,但是父类实例只有在实际上是子类实例时才能转换成子类型。对于数值类型来说,可以随意转换。 -
instanceof运算符
存在继承关系,可以使用instanceof运算,也就是说编译可以通过。如果不存在继承关系,压根没法通过编译。
- 继承与组合
final修饰一个类,它将不能够被继承。
1、组合需要传递参数
2、组合的时候需要对类进行初始化,并将其设置成private属性,比较安全,参看155面例子。
3、使用组合关系并不意味着更大的开销,使用继承的时候一样要对父类进行初始化。
- 初始化块
1、不论初始化块是在主函数的前面还是后面,都在这个类的构造函数之前执行。
2、初始化块相当于将构造函数中无参的部分拿出来了,使得代码更加健壮提高可维护性。
3、若有多个初始化块,按顺序执行。
4、
package practice;
public class Base2 {
public static void main(String[] args) {
Base2 b2=new Base2();
System.out.println(b2.name);
}
{
name="yi";
}
public String name="cheng";
}
这个程序的结果是"cheng",也就是说,初始化块和变量初始化的效果一样。
5、
- 静态初始化块:
1、【代码示例】:
结果:
解释:
- 关于包装类的相互转化