传智播客-刘意-java深入浅出精华版学习笔记Day10

形式参数和返回值的问题深入研究:

形式参数:

形式参数分为基本类型和引用类型。

引用类型:

:需要的是该类的对象,也可以用匿名对象来作为参数和调用的主体。

抽象类子类实现对象。创建该抽象类的具体子类,然后用多态定义,把定义的对象扔到形参去。

接口实例化对象。和抽象类一样,用具体子类实现,然后用多态定义【接口名 对象名 = new 具体子类名】,然后用对象名去实现形参。

返回值:

返回值分为基本类型和引用类型。

引用类型:

:返回的是该类的一个对象

抽象类:也是返回一个抽象类的子类对象。用多态的方法,甚至直接返回new Student.

接口:返回的是一个实例化对象

【这一块很烦而且说不清楚,再用到的时候找示例代码看一下就明白了】

链式编程:

直接用方法的返回值(类的对象)调用该类的方法。【对象调方法,再调方法】

链式编程的特点:每次调用完毕方法后,返回的是一个对象。

包:

包的概述:其实就是文件夹。

包的作用:把相同的类名区分开/对类进行分类管理。

数据库常见的四大功能:增加/修改/删除/查询

分包的标准:按照功能分/按照模块分


包的定义及注意事项:

定义包的格式:

package 包名;

多级包用.分开即可

注意事项:1.package语句必须是程序第一条可执行代码 2.package语句在一个java文件中只能有一个 3.如果没有package,默认没有包名。

带包文件的编译和运行:

1.    手动式:编写一个带包的java文件;通过javac命令编译该java文件;手动创建包名;把b步骤的class文件放到c步骤的最底层的包中;【包名和文件目录名必须是对应的】回到和包的根目录在同一目录的地方,然后运行。运行时,也要带包运行。

自动式:javac编译的时候带上-d即可。这个时候,会


点表示当前路径下创建包,也就是包的根目录是当前目录。编译会自动创建对应目录和class文件,运行时也要带包运行。

不同包下的类之间的编译和访问:

导包:

格式:import 包名,也可以写“*“表示通配符,但是不建议这么做,因为匹配起来很麻烦。

同时注意,所有的包名,根目录都在当前目录下。

【面试题:package,import,class有没有顺序关系?必须有,package>import>class,其中package只能有一个,import可以有多个,class有多个不报错,但是建议有一个】

面向对象各种权限修饰符:

类及其组成所使用的常见修饰符:

修饰符的分类

权限修饰符:private,默认,protected,public

状态修饰符:ststic,final

抽象修饰符:abstract

那么,哪些对象可以使用哪些修饰符呢?

类:

可以使用默认修饰符、public修饰符,不能使用private,protected(限制了别人就没法访问了)

可以使用final(不能被继承),不能使用static(类都静态了你还怎么玩)

可以使用抽象修饰符

其中,用得最多的就是用public修饰。

成员变量:

权限修饰符四个都可以,发挥不同的功能。

状态修饰符两个都可以,分别表示静态变量和常量。

抽象修饰符不可以,因为没有抽象的变量。

用得最多的是private(封装)

构造方法:

权限修饰符四个都可以,构造方法不能被访问时,表示不可以被创造对象。

状态修饰符两个都不可以,因为没有意思。

抽象修饰符也不可以

由此可见,构造方法只能使用权限修饰符修饰。用得最多的还是public。

成员方法:

权限修饰符四个都可以,显然。

状态修饰符静态可以,显然main方法就是静态的,final也可以,final方法不能被重写。

抽象修饰符也可以,就是没有方法体的抽象方法。

除此以外,

成员变量:public static final

成员方法:public static

                public abstract

                public final

内部类:把类定义在其他类的内部,这个类就被称为内部类。

举例:在类A中定义了一个类B,类B就是内部类。



内部类是如何访问的呢?

1.    内部类可以直接访问外部类的成员包括私有

2.    外部类要访问内部类的成员,必须创造对象。


内部类位置:

和成员方法、成员变量平级,在成员位置定义的类,被称为成员内部类。

和局部变量平级,在局部位置(方法里面)定义的类,被称为局部内部类。

下面我们先看成员内部类。

如何直接访问成员内部类呢?要访问内部的成员,就要创造外部的变量。

格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象


成员内部类的常见修饰符:

【提一点,成员内部类可以用private修饰,内部类一般都是不让外界直接访问的,需要用一个方法来访问,方法可以加校验条件】


在main 方法中,通过对Body创建对象,调用method方法来实现心脏搭桥。

所以,第一个常用的修饰符:private

【内部类也可以用静态修饰,因为内部类可以看作是外部类的成员。静态的东西通常不是private的,因为静态的东西就是为了让别人通过类名访问。】

静态只能访问静态,内部类也不例外。静态内部类访问的外部类数据必须用静态修饰。


成员内部类被静态修饰后,不能被外部的对象访问,访问方法是这样的:

格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();

最终new的这个东西,是被外部类限定的静态内部类。

类中,静态类的静态方法,可以直接通过类名调用。【InnerClassDemo4中,show2的另一种调用方式】

所以,为了方便访问数据,也经常使用static。

 

注意事项:内部类和外部类没有继承关系。内部类如果想要访问外部的变量,需要创建对象,或巧用this关键字。


(假装这里有一个指向上边的箭头)通过外部类名限定this对象。

局部内部类:

可以直接访问外部类的成员。

在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。

【面试题】局部内部类访问局部变量的注意事项:从内部类中访问本地变量,需要被声明为最终类型。


为什么?

因为局部变量会随着方法的调用完毕而消失。这个时候,局部对象并没有立马从堆内存中消失,还要使用那个局部变量。【堆内存不是立即回收,但是局部变量是离开作用域就没有了】那么局部变量加了final之后,发生了什么事?编译器把num2直接当成常量了,看见final变量就等于看见了常量(比如20),你消失了,我在内存中存储的是数据20,20会消失吗?不会。所以,我还是有数据在使用。

【为啥没有用静态修饰?局部变量不能用静态,因为静态变量是随着类的加载而加载的,方法不是】

匿名内部类:就是内部类的简化写法。

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类。

格式:new 类名或者接口名(){重写方法;}

本质是什么呢?

上面这个格式代表的是什么呢?虽然它叫做内部类,但是它本质上并不是一个类,而是一个对象。谁的对象呢?

它是一个对象,是一个继承了该类或者实现了该接口的子类匿名对象。

一步到位实现了两步:声明子类/创建对象。

如何调用匿名内部类的方法?


对象.方法,没毛病。(注意后面的分号)

但是如果有两个方法呢?【注意返回值为空所以不能链式编程】


那如果有n个方法呢?

这个方法肯定不是长久之计。麻烦得有麻烦的解决方案。


被选中的部分是接口的子类的对象,没有选中的部分是多态的表示(虽然看着不像多态)。这样,通过调用i就可以调用对象(相当于不再是匿名的了)

匿名内部类在开发中的应用:

用于直接实现形式参数为接口的函数

注意最外面的小括号的位置,小括号写在外面,表示调用的动作,如果写成这样

就会报错。另外,注意如果需要使用多次,那就好好创建子类还是不要用这种方法了。因为每new一次就是一个新的对象。






猜你喜欢

转载自blog.csdn.net/weixin_39655021/article/details/79708362
今日推荐