当前位置 : 主页 > 编程语言 > c++ >

java基础笔记(十一)

来源:互联网 收集:自由互联 发布时间:2021-06-30
覆盖,隐藏,转型和suoer() 十年饮冰 难凉热血田林哥哥复习:多维数组:数组是存放一组相同类型数据的连续固定空间对数组变量的copy其实是对数组指向对象的地址的copy,让两个数组变
覆盖,隐藏,转型和suoer()
十年饮冰 难凉热血
田林哥哥

复习:
多维数组:
数组是存放一组相同类型数据的连续固定空间
对数组变量的copy其实是对数组指向对象的地址的copy,让两个数组变量指向同一变量
System.arraycopy(a,2,b,5,4);
从a数组第二个元素开始,复制4个元素,赋值给b数组的第5个元素开始之后的4个元素

java中支持多维数组,又称‘数组中的数组’
Int[][][]数组中的元素时int[][]对象的地址
Int[][]数组中的元素是int[]对象的地址
这就是,java不谈维度,咱们只谈对象

类的继承:
实现对类的复用;通过继承一个现有的类,从而使用已定义的方法的变量;但是不能继承构造方法和私有方法、私有属性
java只能单继承(一个父类),但是可以多实现(多个接口)


创建一个子类对象并不会创建父类对象,继承了父类非私有的属性方法,再动态绑定父类的私有属性,再调用父类的构造方法,在调用子类的构造方法

一个类和静态方法/属性建立关系,就是关联,
一个类和实例方法/属性建立关系,就是绑定
在执行的时候,使用对象空间,进行动态绑定
在编译的时候,根据类信息,进行静态绑定

在一个类中,绝对不能有两个 方法名,参数签名完全相同的方法;
如果参数签名不同,那就叫重载;

重写则是发生在有继承关系的父类子类之间;
子类对方法的重写叫覆盖,对静态方法、属性的重写叫做隐藏

在对子类进行初始化的时候,有三种方法:从父类继承的方法,子类重写了类的方法(覆盖),子类新增的方法
上转型:用父类的引用型变量保存子类对象的地址,该对象只能看到继承的东西,不能看到新增的属性、方法  
Animal A= new Person();//人是动物
人继承了动物的sleep()方法,所以该对象A可以调用sleep方法,但是不能调用子类新增的 写文章write()方法
下转型(造型):有上转型关系的变量,再把该变量A所指对象里的属性方法取出来,在转化生成为一个子类对象,返回给P,A依然存在
A  instanceof  Person;//判断该变量跟Persopn有没有上转型关系
Person P = (Person) A ;
P.write();//该变量所指对象就可以调用写文章方法了

覆盖的注意事项:
子类得先继承父类的方法再重写,重写只能一次
两方法的方法名,参数签名,返回值类型要相同,子类该方法的访问权限不能小于父类该方法的访问权限,并且子类不能抛出比父类还多的异常。
参数签名和返回值类型必须相同,访问权限要大于父类方法,抛出的异常要小于父类方法
如果子类继承了父类的sleep方法,但又重写sleep()方法,覆盖了父类的该方法,那上转型变量A连sleep都调用不了。


新姿势:
访问控制:
private:只能在同一个类中访问
默认default,就是啥也不写:只要在一个包里就可以
protected:子类也可以访问protected修饰的父类方法属性
public:全局都能访问
Public>protected>default>private
全局	>  子类	>同一个包>同一个类
PS:注意导包	









teacher.java详解:
	调用父类构造方法进行设置的时候,要是在对象空间里找不到属性(name,age),那就到与父类动态绑定的空间里找;再调用子类的构造方法
t.setName(“田林哥哥”);//该方法是:this.name=name;
从父类继承的方法setName,是跟父类Person静态绑定的,在对象中找不到name属性,但是该方法要用,就会到该方法静态绑定的类的动态绑定的空间里面找name;

t.showName();//该方法是return this.name;
会报错,因showName方法被覆盖了,所以该方法是和teacher类静态绑定的,所以找不到与该类动态绑定name属性,就会报错
t.sex;//可以直接通过t调用sex属性,因为sex属性是继承来的,在对象空间中有

方法转型的例子(中兴面试题):
父类子类都有showMe(),子类把父类的showMe覆盖了;
Base base = new Sub();//创建一个子类对象把地址给父类的引用型变,上转型
1.base.showMe();//用父类的引用型变量调用showMe(),会调用覆盖的方法
2.base.print();//print会调用showMe方法,base会调用子类中覆盖的showMe方法

把父类中的showMe改为私有,那子类就不会继承该方法,那子类的showMe就不是对继承方法的重写,而是新增的方法;
3.Base.showMe();//会报错,因为父类型的引用型变量不能调用子类新增的方法


4.Base.print();//print方法中会调用showMe方法,那他调用的是父类的私有方法showMe,还是子类的新增方法showMe?
base调用从父类继承的print方法,在print里调用showMe,因为print是与父类静态绑定的,不能调用子类新增的方法,而会找到与父类静态绑定的私有方法showMe。
父类的引用型变量不能调用子类的新增方法;
5.Sub base = new Sub();
		Sub.print();//用子类的引用型变量访问子类,还是调用父类的showMe();print还是在父类定义的,所以print方法看不到子类新增的showMe
从父类继承的方法也不能调用子类的新增方法!
6.父类的构造方法如果调用methodA,而子类重写了父类的methodA,那么就会调用子类的methodA,然而子类对象此时还没创建,这时候就会返回null
不要把眼睛放在他人和自己的差距上,因为总有你比不上的人,这种气馁没意义;我们应该把眼光放在我们比昨天进步了多少,只要我们在前进的路上,总会成为一个更好的人。

隐藏:子类对属性和静态方法的重写
父类子类都有静态方法methodA
用父类的引用型变量调用静态方法时,会调用父类的方法methodA;
就算父类的属性和静态方法被子类重写了,用父类的引用型变量调用时,还是用父类的静态方法和属性。

super关键字:表示父类的绑定特征
通过super到子类所继承的父类中找到与父类绑定的属性和方法
语法:super.父类中的属性or方法
super用于调用父类中定义的属性和成员方法
覆盖的方法都是跟子类绑定的,所以找不到与父类动态绑定的私有属性,所以需要通过super关键字找到父类静态绑定的方法和动态绑定的属性
PS:super不能出现在静态方法里,因为静态方法都是通过类调用的,不能接收this指针

super在构造方法的作用:
通过super来显示指定调用父类的哪个构造方法,同时给该构造方法传参数
语法:如果要显示调用父类的某个构造方法,就必须放在子类构造方法的第一句并且传进对应的参数,只能写一条!
子类构造方法(String name){
	Super(name);//就会找父类的参数签名为String的构造方法,把this指针传给该构造方法
}

不问过往 直奔前程
2R}560FX0B]_)9OOJJW{]`O.png
网友评论