从c语言转至Java如何快速上手(java学习tips)

目录

原文章:

一、基本知识

1.

同时为了方便,我们称:

2.

二、main函数直接输出变量

三、class里面的函数/方法:

四、构造方法:

补充:老师ppt:

补充:关于this:

五、类方法(静态方法/类函数):

4.类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用。

5.静态方法只能访问静态的成员,不可以直接访问实例成员。实例方法可以访问静态的成员,也可以访问实例成员。

6.静态方法中是不可以出现this关键字的

六、static相关:

1.static定义的变量是可以共享的:

七、包:

1.

2.

3.ppt里面没提到的内容:

八、访问权限/访问控制:

1.class类文件的访问权限:

2.类成员的访问控制:

九、get方法和set方法:

十、继承:

注意:

十一、super关键字:

1.对于变量:

2.对于构造方法:

十二、方法的重写(@override):

十二、注解:

十三、多态:

1:(向上转型)父类引用变量可以指向子类对象(在父类创建对象)。

注意:

2.向下转型:将这个父类对象还原为子类的对象

十四、final:

十五、抽象类(abstract):

值得一提的是,

作用:

十六、接口(整合了多态、继承以及抽象):

1.接口内的所有方法都必须是抽象方法:

2.另外要说明的是:


原文章:

从c语言转至Java如何快速上手(java学习tips) - 知乎

此文章为作者本人搬运至该网站。

此为本人学习java课时所了解到的一些小知识点,由于有c语言与部分c++基础,所以文章就写得比较随意一点拉。


一、基本知识

1.

java面向对象三个特性:封装,继承,多态!!!

java为面向对象的语言(object oriented programming—OOP),所以程序代码不像c语言(面向过程:procedure oriented programming—POP)那样是从头到尾把流程写得彻彻底底,而是分成了许多类(以下称class),每个class里面都有属于自己的一部分东西,最后再通过main函数引用class的东西搓出来一个程序,

就我目前认知看来,首先就是每个文件就是一个class,文件的名字必须和class的名字相同:

当用IDEA创建一个class文件(在这里我起名字为circle后,软件就会自动给你生成这个class的框架代码以及main函数:

public class circle {
    public static void main(String[] args) {
        
    }
}

就是以上这些。

而上面那个图里面的内容就是这个类的最基本用法:

你可以在class里面定义变量,之后再在main函数里面用。

比如这里我定义了一个a = 2,

而要在main函数里面使用这个变量,就需要针对这个class命名一个新的class变量名字,

之后再在main函数里面引用这个变量,不过需要在main函数里面新定义一个变量。

觉得有点乱?其实这就和c语言里面的结构体差不多嘛!

#include <bits/stdc++.h>
using namespace std; 

struct circle{
    int a = 2;
};

int main(){
   struct circle c;
   cout << c.a << endl;
   return 0;
}

再对比一下看看?是不是一目了然了?

同时为了方便,我们称:

这种为实例化一个名字为c的对象

而:

这种我们成为定义一个变量

变量和对象这两个还是要区分开滴~~


2.

java既然是由class组成的语言,那么就不能只有一个class嘛,

只不过就如我上面提到的,文件名字必须和class的名字一样,这也就意味着,一个文件里面只能有一个class。如果你想再弄一个class的话,那就需要在这个src文件里面再加一个class类文件。

同时也需要意识到的是,你在这个class文件中定义的变量,也是可以在另一个class的main函数中直接使用的!(不过需要有public这个前缀)

这里我就不放出例子了,省时间~

同时要注意到的是,经过我自己的测试,我发现在两个class文件中,都是可以写main函数的!

两个main函数也可以不一样,并且都可以独立运行!


二、main函数直接输出变量

如图,如果在不new一个变量的情况下,想直接使用class里面的变量就需要给这个变量加个static,

static的作用:

以防自己忘记,再说一遍:

一句话总结:static定义的变量不会因为代码又走到这里时候,的数值又重新被还原为一开始定义的数值


三、class里面的函数/方法:

class里面不能只有变量,也要有函数:

而在这里,在java里!!!

没有 函数 这个名字了!!!

函数这个名头已经被驱逐出境!!!

我们所有的函数都改头换面!!!

改名叫方法!!!!


发个小疯不必在意(

上课时候我还对老师一直讲的“方法”嗤之以鼻,觉得这不就是函数嘛,结果现在还是我太年轻了。。。。

其实就是说,下面这个add函数,我们可以叫它为实例方法。(今后我们都会用方法代指各个“函数”)

如果你好奇为什么叫实例方法?

什么是实例方法?-优快云博客

其实就是相对静态方法而言的,

那么什么又是静态方法呢?

可以往下看目录里面第五个

第一次了解它的新名字可能会有些许陌生,不过后面应该就会很好理解了。


四、构造方法:

不要把构造方法和实例方法混为一谈!!!

不要把构造方法和实例方法混为一谈!!!

不要把构造方法和实例方法混为一谈!!!

和class里面写个实例方法不一样的是,构造方法,不写函数类型,也不写return,

下面这个就是构造方法了:

同时也意味着这个“方法”的名字必须是文件的名字。

我们要意识到一点的就是,这个构造方法是每个文件都会自带的,只不过自带给我们的是一个什么都没有的空方法。

另外就是!!!

这个构造方法是在我们new一个方法对象的时候,也就是:

这个时候就会调用使用了!(运行这段代码的同时也会运行那个构造方法里面的代码,不需要额外写出运行构造方法的代码)

运行结果:

补充:老师ppt:


补充:关于this:

看不懂可以去下面的九(


五、类方法(静态方法/类函数):

这个“方法”其实和第三个中的函数类似(也就是说,虽然也叫做方法,但是和第四个里面的构造方法不一样)。

不过要在public和返回值类型中间加上一个static:

在此放出我们老师的ppt:

前三个直接跳过,从第4个开始:


4.类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用

什么意思呢?

比如这里,我们建立一个变量c,之后可以用c.sta()调用这个函数,但是我们也可以在不用变量的情况下直接使用sta函数——circle.sta(),如图:


5.静态方法只能访问静态的成员,不可以直接访问实例成员。实例方法可以访问静态的成员,也可以访问实例成员。

至于这个,如果你还搞不清楚静态成员和实例成员的区别:

静态成员和实例成员的区别_类的实例成员与静态成员的区别-优快云博客

其实静态成员不就是多了个static嘛!


6.静态方法中是不可以出现this关键字

这个不多解释,毕竟你直接使用这个方法了,都没有实例一个对象,那么又何来的this呢?


六、static相关:

1.static定义的变量是可以共享的:

这里把country定义为static,并且赋值为“大清”,

在下面main函数中只改p1.country的数值,则p2.country也会改。

但是并不推荐这样改,建议还是用class名字改,也就是Person.country。(见上面五中的4)。


简单来说,static定义之后,这个东西就固定在这里了,没有所属。调用它的时候也不需要带上实例的对象名。


七、包:

1.

包,简单来说,就是对class类文件的分装。

而如果你打开文件所处位置的话,就会发现其实这些就是一个个的文件夹。

创建包的名字就是xxx.yyy.zzz,每个中间都有点符分隔,

比如上面就是com.pack(包的名字),

那么就会创建一个com的文件夹,里面又创建一个pack的文件夹,在这个pack文件夹里面创建class文件。

在包内创建class文件就会自动出现:

(这个class的名字为person)

会自动出现红框里面的内容。


2.

既然class都用包分类了,那么就肯定不能直接使用其他包内class的变量或者方法喽,

所以解决办法就是:

这个新的class文件在com.test包中

加入一个import,以及这个class在包中的全名。

这样就可以使用另一个class文件里面的变量拉~


3.ppt里面没提到的内容:

感觉不是很重要,就只放ppt罢:


八、访问权限/访问控制:

这里其实就是给class类文件以及里面的成员变量加一个限制条件,

就是public,private,default,protected。

1.class类文件的访问权限:

之前我们对class文件都是默认带上public的

这样的话,根据上面ppt的内容,其他包中的class文件就可以调用这个class的东西了(只不过还要加个import)

(注意是其他包!!!同一个包里面还是可以直接用的!!!)

而无修饰,其实就是default,不过default是什么意思呢?


在这里我插个题外话,不知各位有无玩过minecraft(

这个材质包想必玩mc的都不陌生(

因为它就是mc的默认材质包,

所以default的翻译也就理所当然为默认拉~~


扯远了扯远了,

既然是默认,那么对于成员变量来说,如果不加public或者private什么的来说,那就是一般的普通变量。

也就是说,咱平常是写不到这个default的,如果没有其他修饰,那么默认的就是default类型的。

但是对于class类文件来说,如果咱不加这个public,那么在不同包的类中,即使有import,也不能调用变量了。

这里就出问题了。


2.类成员的访问控制:

对于类成员,就多了private和protected这俩,不过一般好像也用不上protected

比如:

在这里我分别定义了三个变量,在同一个类里面均可以打印输出。

但是在同一个包下面的另一个class文件(同一包中的子类)里,同样是从test2中声明的变量,但是pri就不能输出(这里因为是同一个包所以不需要import),原因就是它是private的。

符合这两个要求。

至于这个子类和非子类,似乎是继承和父类那边的内容,就先暂且不讲了~


九、get方法和set方法:

这两个方法主要用于private的变量,因为private变量我们不想让其被肆意修改或者是不合逻辑,但是我们又不能在其他class类里面直接使用这个变量,于是就有了get方法和set方法:

事先说明,这两个方法均为自己写出来的方法,虽然IDEA可以预设,但是最好还是自己写一下。

比如这里我分别写了两个set方法和get方法:

上面是在test2里面写的变量(注意这里pub没有赋值)。

这里我在test1中生成一个test2的变量t,而一般来说是不能直接用t.pub的,因为pub为private,但是如果用t.setPub给pub赋值为123,就是test2中的public的方法,就可以实现曲线救国(bushi

就可以间接给pub赋值了~~

下面的systemout也可以用getpub来输出这个值。


十、继承:

java的第二锤!!!

继承,指的是一个class类文件(称作子类)继承另一个class类文件(称作父类)。

具体办法是在该class名字右边加个extends 另一个class:

这样就相当于test1中可以拥有test2中所有的不包括private定义的变量和“方法”:

比如这里,我在test2中定义了两个变量(default类型)

这样子的话,就可以直接定义test1的变量,之后再输出test2中的a和b,这样其实就相当于:

并且经本人实测,

这样的继承只能发生在同一个包的同一个文件夹里面;

并且父类不能拿子类的东西(这不废话嘛);

并且继承只能继承一个,不能说一个class继承两个class。

不过可以让A继承B,再让C继承A,这样C就可以使用ABC的东西了。

至于应用,我觉得也是为了避免一些数据重复使用的情况,减少代码量。

注意:

这里继承并不包括实例化的对象,比如:

在父类里面写的这几个对象,在son子类中并不可以直接使用。


十一、super关键字:

1.对于变量:

super关键字,是相对于this关键字来说的,

不过我们还是要加上上节的继承:

还是一样,我们在test2中定义了a=114,

但是如果我们在test1中也定义了个a(数值为1919)呢?

结果就是,输出的是哪个a,取决于用的是this还是super

这里是在class中写的方法,那么这样就会输出两个

其实上节说的extend就是把另一个文件里面的变量还有方法全部复制粘贴到这个class里面的说法,并不准确。

因为也是可以这样在两个class中定义同名字的变量的,可以通过super和this来指代。


2.对于构造方法:

对于extend继承的两个class,众所周知,当对这个类生成一个对象的时候,就会自动运行这个class的构造方法(如果有写的话),那么问题来了:

如果两个class都有构造方法的话,那么应该先运行哪个呢?

答案是,在运行子类的构造方法中,首先运行父类的构造方法。

是不是有点绕?下面有个例子:

然后再在子类中:

运行:

结果是,先运行了父类的构造方法,之后再运行了子类的。

原理:

其实子类中的构造方法,隐藏了super这个方法,它的位置必须在子类构造方法中的第一行。

如果父类构造方法不需要传参数,那么其实这个super();也可有可无。

如果test2需要一个string参数:

那么super就不能缺少,且必须要加个参数传入。


十二、方法的重写(@override):

这里老师讲的和网课有所冲突,就先按照网课的来~

重写,字面意思,就是改造已经写好的方法。

在加一句的话,那就是子类class中可以重写一个在父类class中已经有的方法,不过需要遵循以下法则:

1.这个方法的外壳必须要和父类中的一模一样(也就是大括号{ }外面的东西,指public void之类的)

2.写这个方法前,最好在上一行加上个@override,其作用如下:

Java中@Override的作用_overriide-优快云博客

简单来说就是,如果要重写的话,最好加上,程序会帮你判断你重写的是不是那个方法。

比如这里,我在父类里面写了个print函数(我发现直接用father和son当class文件名更清晰)

而如果在子类class中写了@override以及print,那么就会运行重写的方法:

要注意的是,这里两个print函数的外壳都是一模一样的,都是public void print()。


十二、注解:

事实上,上面的@override就是注解中的其中一个。解释的话,基本上相当于给程序阅读的注释(只能写固定格式的注解,以及程序能够根据其做出相应检查),

下面有一些其他注解,不过个人感觉不是很重要:

不过根据override(重写)这个名字有另一个叫overload(重载),不过其似乎并不属于注解的一部分,那就放到后面再说~


十三、多态:

Java基础(多态的理解与应用)_java多态-优快云博客

java第三锤!!!

最重量级的一集!!!(因为我第一次看视频居然没有看懂23333)

多态也是相对于继承来说的,同样需要父类和子类,

多态的内容又多又抽象,我这里就介绍它的几个特点吧:


1:(向上转型父类引用变量可以指向子类对象(在父类创建对象)。

我知道肯定有点抽象(太抽象了好伐),那我们直接上例子!

Java:什么是向上转型与向下转型(详细图解)-优快云博客

从这个文章来看,向上转型,就是子类和父类都有的同名方法的情况下,可以通过用父类的对象名去引用子类的方法:

比如这里写了个son方法(需要注意,必须要有extend父类)

这样就可以实现父类调用子类方法了,

不过这样子并不适用于 父类调用子类独有的方法

优点:让代码实现更简单灵活
缺点:不能调用到子类特有的方法

注意:

我才意识到,对于父类和子类都有的重名方法,那么子类的方法其实就是重写!!!

所以最好在子类的方法前加个@Override


2.向下转型:将这个父类对象还原为子类的对象

如果我们的这个父类对象又想调用子类的特有方法呢?

就需要向下转型:

比如说我们对son1文件定义一个独有的pri方法,

那么若需要向上转型的父类对象调用这个方法,则需要把这个对象强制转换为子类

强制转换,c语言学过吧?在这个对象前面加个括号以及括号内的文件名即可。

(其实红框里面那个f = (son1)f 不写也可以)

不过缺点就是:向下转型使用的比较少,而且不安全。如果转换失败,运行时就会抛异常。

毕竟c语言的强转就有可能丢失精度嘛~


十四、final:

ppt中写的是终结类,但其实也可顾名思义,

final,最终的,不可以再改变的。其对于程序的作用,一言以蔽之:

上面分别是变量,方法,以及类class,不过final类也还是可以继承其他class的。

final修饰对象似乎也可以,不过目前我还不知道其的限制。


十五、抽象类(abstract):

省流版:

抽象,在这里指的是两个部分,分别是抽象class,以及抽象方法,这两个都需要加上abstract前缀。

对于抽象class,其内部可以写上抽象方法(也可以写正常方法,也就是说,抽象方法必须在抽象class里面,但是抽象class不一定全是抽象方法):

比如这里写了两个抽象方法abb和abb2,抽象方法只需写出名字,不需要写方法内部的过程。

那么它具体用在哪里呢?

用在继承里面,这个抽象class可以当作一个父类,让子类继承它:

而一旦继承了,这个子类class就必须要重写父类中所有的抽象方法,把它们形象起来。

(具体点就是说这个抽象方法最终肯定是要用的,但是肯定不能抽象着用啊,所以要形象起来)

然后就可以在子类或者其他的class中写main函数生成对象了,

值得一提的是,

向上转型指的是子类重写父类中已有的方法,重点是 用父类创建子类的对象并引用子类方法

那么也就是说只要在同一个包内,那么任何一个class都可以创建这个 用父类创建子类对象 的行为。

创建完成后也是可以写对象并运行方法。

这里的向上转型,也是可以调用子类中的方法的。


另外,一般来说抽象类是无法自己创建对象的(指的是下面图的那个,用自己的类创建自己的对象,如果用自己的类创建子类的对象,那么就不需要重写了)(因为方法都是抽象的怎么运行?)

除非你在创建对象的时候就自己再把那些抽象方法重写一遍:

不过这是我自己想试试偶然发现的_(:з」∠)_


作用:

如果硬要说的话,我感觉基本就是起到一个规范化的作用,你只创建一个抽象父类,那么创建子类的时候重写这些方法就可以做到多元性,同时也因为如果不重写这些方法就会报错,也起到一个提醒的作用。


十六、接口(整合了多态、继承以及抽象):

省流版:

其实我觉得接口已经可以和封装继承多态并驾齐驱了_(:з」∠)_

也可以说,接口是建立在 抽象 基础之上的。

接口是一种特殊的抽象java类,其特殊之处之一在于其抛弃了class,而是改用interface:

那么其还有以下特点:

1.接口内的所有方法都必须是抽象方法:

并且由于程序默认的是抽象方法,所以不需要你写public和abstract。

那么其与抽象不同的地方就在于,其与其他方法的 链接关系 不是 继承extends,而是 实现implements

并且一个class可以 实现implements 多个接口类,但是只能继承一个父类:

与此同时,既然 实现 了这两个接口,那么就和 抽象类的继承 一样需要重写(改名为实现)这两个接口内的所有抽象方法。

而实现了之后,就可以创建对象了:

还是同样的可以用 父类创建子类对象(向上转型)

2.另外要说明的是:

父类创建出的子类对象不能调用接口类的方法,也就是子类中 实现 的方法,

只能调用父类本身的方法,因为其毕竟和 接口 不是一家的嘛。

而如果是子类创建自身的对象,那么就可以用自己实现的方法以及父类的方法的。


(已停更)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值