Java自学道路心得体会
成员与静态(static)
- 成员变量是写在类中,成员方法是public xxx类型 xxx方法(){},它俩需要创建对象才能调用。
静态变量是写在方法中,静态方法是public static xxx类型 xxx方法(){},只能用类名 . 方法,静态变量不可调用。
关于抽象:
- 既然已经有父类可以让多个子类继承,为何还要看起来不知道干嘛用的抽象?
- 答:自我理解是继承正常父类,没有太多约束,一号继承其中部分方法,二号继承别的,而抽象方法是子类必须要覆盖重写的,可以做到统一性。
关于接口与父类区别:
- 除了书写格式区别,父类中新加一个普通方法,子类可以调用。而接口无法新添加一个普通方法,因为public 后面要不就是default ,要不就是static ,再要不就是抽象的方法(abstract),所以对应起来,接口的default 对应父类中的普通方法,其他俩个一 一对应。
- 一个子类对应一个父类,但一个实现类可以对应多个接口。
- 类中的成员变量对应接口中的(public static final )常量。
静态方法:
- 直接用类/接口调用,无需用对象调用。
多态
- 关于 多态对象.方法 的一些说明(父类引用指向子类对象)。
这个对象c是向上转型,由Child类型转为Parent类型,好比,
Cat cat = new Cat();
cat.eat();
转为了Animal cat = new Cat();
cat.eat();
原本是猫吃老鼠,通过多态转型为了动物吃老鼠。
但图中
Child c = new Child();
c.play();
代表孩子玩耍,
但通过多态的向上转型变为了:
Parent c = new Child();
此时再c.play();
则变成了父母玩耍,但父母类中无玩耍方法,也即并非父母就都玩耍,所以会报错(向上转型后无法调用子类特有的方法)。
Parent c = new Child();
这个对象c所指的类是子类,但是c引用的是父类中的前三行,即指向子类时也只指向子类中覆盖重写父类的方法。因此,我们才会说:编译看左(父类/接口中有没有该方法),执行看右(子类/实现类中有没有覆盖重写该方法)。
向上再向下转型的意义
- 比如女朋友说给我一只宠物,那么我们可以定义一个参数类型为对象(对象:pet),返回值类型为void 的方法。
但是我们给了一个狗或一个猫,那狗能看家,猫能作伴,那此时就需要向下转型(pet从动物类转为了Dog或Cat类),用instanceof 判断我们向上转型前是狗还是猫类,然物尽其用,若给了狗,可以调用Dog类中的看家方法,给了一只猫,则可以调用Cat类中的作伴方法。
自己写的笔记本USB接口案例的总结
- 首先,笔记本想要使用键盘和鼠标,可以直接使用,而不通过一个统一的USB接口设备,但是,这样一来,如要升级添加一个新的设备(新类),那么则需要在笔记本中添加能用这个设备的调用(即笔记本中使用设备中,重载一个新的设备方法,传递新的参数类型),但是笔记本都卖出去,显然这样做不现实。
- 因此,我们需要一个过度口(接口),让笔记本只负责使用有USB接口的设备,无需在乎是什么设备,不用给电脑安装新的可以设用新设备的功能。
- 所以在笔记本的类中,我们只需要创造一个可以调用USB的方法,以USB这个接口作为参数,在方法中使用USB的方法即可。
- 此时若有新的设备(新的类),那只需要让它连上接口(作为接口的实现类)即可。而这个时候的笔记本电脑通过USB这个接口就可以使用新设备了。
内存图的一些理解(★)
- 用方法定义的变量是引用变量类型(即引用了地址),但是我老是想,String a = “abc”; 这个a里面的是字符串类型的东西,其实里面是地址值,只是因为String 方法自带了toString方法,把地址值转变为了字符串,其实应该是字符串 “abc” 在堆内存中的地址,因为 String a = “abc” 应该是
-String a = new String ;
a.toString;
应该是这样才对。
所以我经常看到引用类型的时候想到总是,哎!它这个值不是给另一个引用类型变量了吗?怎么这个已经被赋值的引用变量还能再去点个方法呢?难不成,我得到的值还能引用方法?
其实是类似于:
“abc”.method 一样,a是被赋值了,看起来a好像是被赋值为字符串“abc”,其实“abc”是 a.toString 的调用,所以a里面是“abc”的地址,所以我们才可以用看起来好像是被赋值的a来调用别的方法。我们只是用toString方法打印出来“abc”这个符号(样貌),其实“abc”实际存的可是地址值哦,所以“abc”.method 也是成立的,千万不要再把引用类型变量看成被赋值的普通变量了。
关于面向对象和面向程序
- 面向程序:是主要在乎程序的具体的写法。具体的里面的功能,主要考虑里面写什么,然后通过main方法调用,来实现一定功能。
- 面向对象:是主要在乎能调用什么,不在乎具体方法里面有什么功能,只管调用。所以当用main方法执行时,代码显得十分简洁,因为具体的方法在另外地方写,main方法只管创建一个关于该类的对象,再调用即可(调用成员变量/方法,用new 创建一个对象来调用)。
关于创建的对象的一些自我理解
- 创建对象基本上是XX(引用数据类型) XX = new XX();
- 所以对比一下基本数据类型的定义,eg:int a ;
- 所以我自己的理解是,对象就是基本数据类型中的变量。
关于集合Array List<>的一些理解
- 这个问题是我在Java SE阶段写的学生管理系统遇到的一个烦神很久的问题。我以为第一个情况是将集合初始化。
- 详述:遇到的问题是我一开始将new一个新的集合放在while循环中以至于每次循环导致集合每次变成空的。然后拿出来的时候听别人说什么要ArrayList = NULL;来初始化,说什么不用new 一个,但是我连new 都没有,因此在内存里面根本就没有创建一个集合。
- ArrayList = NULL;
并非初始化,而是完全将集合置空,不存在的意思。 - 而ArrayList = New ArrayList<>();
则是先定义了一个空的集合来给你用。
多线程
- 并发与并行:
- 前者是海绵宝宝有一次晚上答应珊迪、派大星、蟹老板帮忙,然后一晚上跑来跑去(切换)执行任务。
- 而后者则是海绵宝宝变成好几个同时去执行。
- 进程与线程:
- 前者是指,比如我点了电脑管家这个程序,那么它就会被从硬盘转到内存去执行,转到内存后的程序叫做进程。
- 后者是指,点击电脑管家里面的病毒查杀或者是清理垃圾执行时就会开启一条应用程序到CPU的路径,CPU可以通过这个路径执行任务,而这个路径就叫做线程。
- 我的电脑CPU是Inter Core(核心) i5-6300HQ,这个CPU是四核心、四线程,也就是最多可以执行四个任务。比如电脑管家的病毒查杀、清理垃圾、电脑加速这三个任务如果同时点开,创建了三条到CPU的路径(线程),那么如果我的CPU是一个线程的,它为了同时执行,不得不像海绵宝宝那样跑来跑去(切换)任务,这样其实很慢的(每个任务被执行到的几率是三分之一)。但是如果换成了我的四线程来跑的话,一个线程照顾三个任务,那为了更快,四个线程会同时在三个任务间跑来跑去(每个任务被执行的几率翻了四倍 。ps:不是100%哦,因为有可能四个线程同时跑了一个任务哦),这样就很快了。
- 但是多个线程之间不会互相影响,各跑各的。
- 不过这个切换很快的,感觉不出来。
数据库服务器软件
- 数据库服务器软件包含若干个服务器,而这些服务器存在形式是文件夹。
- 服务器包含若干个表,而这些表的存在形式是文件(.frm)。
- 表包含若干数据记录,而这些数据记录的存在形式是文件里面的数据信息。
SQL
- SQL对应着普通话,关系型数据库(eg:MySql、Oracle等)对应着中国人,而这些数据库自己的语言对应着各地的方言,因此SQL是统一标准的语言。
三大范式
- 一些概念(通俗版):
- 函数依赖:一对夫妻的亲孩子,或者孩子是父亲的,但父亲二婚,父母中母亲确认不了的,再或者是光棍父亲带着孩子确认的。
- 完全函数依赖:孩子的确定是跟父母都有关系的。
- 部分函数依赖:父母带孩子确认,发现孩子是母亲的,跟父亲没关系(无需靠夫妻二人皆确认的)。
- 传递函数依赖:函数依赖确定孩子,通过孩子的函数依赖确定孙子。
- 码:好几个孩子都只由一个父亲或者一对夫妻两人都确认的,那这个父亲或者这对夫妻就是表的码。
- 第一范式:表中每一列就是单独一列,不会大列套几个小列。eg:学院列下面还有部门列和部长列。
- 第二范式:一范式基础上,消除部分函数依赖(父母是孩子的亲父母)。
- 第三范式:二的基础上,消除传递函数依赖(孩子没有后代)。
一些我以前一直不懂的名词
- jar包:其实就是一系列类的集合体,比如用Java连接数据库,但是数据库多种多样,我就可以定义一个接口(即一个规则:JDBC),而这个接口的实现类即各个数据库厂商为了能带动他们数据库所编写的实现类集合,即驱动jar包(驱动用来连接数据库的jar包)。
- 实体类:实体类映射的是数据库的表,你对实体类操作,可以直接对应到数据库的表的操作。
- 类对象:
JDBC
- 概念:Java Database Connectivity Java数据库连接,Java语言操作数据库
- JDBC本质:官方定义的一套操作所有关系型数据库的规则(接口)。各大数据库厂商去实现这套接口(写的实现类就是数据库驱动),提供数据库jar包。我们可以使用这套接口(JDBC)编程,真正执行代码是jar包中的实现类。
- 步骤:
1、导入jar包
2、注册驱动
3、获取数据库连接池对象 Connection
4、定义sql
5、获取执行sql语句的对象 Statement(这里不懂什么叫获取执行sql语句的对象 Statement,Statement不是一个接口吗?)
6、执行sql,接收返回值
7、处理结果
8、释放资源
JDBC的对象
- DriverManager(Class):驱动管理对象
1、注册驱动:告诉程序使用哪一个数据库驱动jar包。 Class.forName(“com.mysql.jdbc.Driver”); PS:这里其实用的是这个类里面的一个静态代码块来驱动的。
2、获取数据库:getConnection(String url, String user, String password);这里的url是 :jdbc:mysql://ip地址(域名):端口号/数据库名称 PS:如果连的是本机数据库可以省//… …/内的内容。 - Connection(interface):数据库连接对象(以下说的对象并非是指接口的对象,而是接口实现类的对象,这个老师讲的我糊涂了)
一、功能:
1、获取执行sql对象:
Statement createStatement();
PreparedStatement preparedStatement(String sql);
2、管理事务:
开启、提交、回滚。 - Statement(interface):执行sql对象
1、boolean execute(String sql) - ResultSet:结果集对象
- PreparedStatement:执行sql对象
网络相关的知识点
- 网络通信协议:
1、TCP/IP:在传输数据前需要建立三次握手来确保数据传输安全性,完整性。常用于:下载/上传/发送/接收文件,浏览网页。
2、UDP:耗资小,通信效率高,偶尔会丢失部分数据,常用于:发语音,打字,发视频。特点:数据被限制在64kb以内,超过了就不能传输了,所以有的时候说您输入的字超出范围。
配置文件是什么
- 比如你在你电脑上用你的数据库写了代码,完事后打包发到别人电脑上,但是你俩电脑用的不是一模一样的数据库,就用不了这个代码。
但是如果有了一个东西,可以更改这个代码所依靠的数据库,那就可以了,这个就是配置文件,把配置文件中用的数据库改为你自己的就行。
系统是什么
- 即若干部分相互联系、相互作用,形成的具有某些功能的整体。
——
框架一类的解释
- IOC框架:
原本代码是这种相互关联影响的
现在用了IOC容器就降低了耦合度,彼此之间单独操作,不互相影响(某个对象需要什么,IOC就自动生成什么,各个对象(类)互相独立)
- IOC框架下的产品:
比如Spring框架
面向编程
- oop&aop(用作切面)
oop是面向对象编程,而aop是面向切面编程。
-前者是分成各个类,来提高代码的复用性。
-后者是如图
因此将代码从原来的二维平面(复用类与类中的方法)升级为三维(复用具体代码且不增加耦合性)。
IOC(控制反转) & DI(依赖注入)
- 前者是:
原本A类需要一个B类来配合使用,所以A会找一个或者创建一个B,这样提升了耦合性。
但现在用IOC容器,IOC来找或者创建B,让A找或者创建B的权利交给IOC。 - 后者是:
在容器(比如:Spring容器)创建B的时候,将B依赖属性通过配置(配置文件)进行注入。
SpringBoot一些名词解释:
- 单实例的:也就是从IOC容器中拿出来的,互不干扰的组件。
枚举类型(enum)是什么:
- 枚举说白了,就是一堆固定了值的类型。
比如说你现在声明一个变量string week ,要给它赋值,很明显它的值应该是从星期一到星期日,也就是说你只能给它赋这七个中的一个才有意义。
为了防止用户录入了错误的信息,设置了枚举变量,规定只能选择此变量中的一个值。
四大元注解:
- @Target:表示我们的注解可以用在哪里,是用在方法上,还是类上面。
- @Retention:表示我们的注解在什么地方有效。
- @Documented:表示将我们的注解表在JavaDoc中(Java生成的文件)。
- @Inherited:表示子类继承父类的注解。
关于static
- 静态变量:static int age; int age;
这两个一个静态,一个非静态。 - 静态方法:static void Method1(){}
void Method2(){}
这两个一个静态一个动态。 - 先有静态,再有非静态,所以非静态方法可以调用,静态与非静态变量,而静态方法只能调用静态变量。
不太清楚的问题
- 为什么要用Java进行数据的增删改查,而不直接在数据库更改?
- 答:因为后期对数据要进行大量的增删改查,倘若每次操作都要进行一次sql语句的执行,岂不是很麻烦?可能用navicat感觉不太出来,觉得写一次多次利用。。。这里我也不知道了,我感觉Java不也是调用sql语句吗?两个都是,我不太清楚了。。。还是因为Java用的是JDBC规则,可以直接使用多种关系型数据库?也许是吧?
三大范式:
微服务:
- 理解为:比如,淘宝有下单,放入购物车,收藏功能等等,把这些功能单独抽离出来写,并且有各自的服务器,可以各自更新,就是微服务,是一种框架风格。