Java与C/C++不同的一些基础知识点

0. 类与文件

一个 java 文件可以写多个类,每个类里面可以有main函数,一个java文件里面只能有一个 public 类,此时 java 文件的命名只能是public类名.java。使用 javac 编译一个 java 文件时,如果有多个类,会生成多个 类名.class 文件,java 类名 执行程序(单元测试)。多个class 文件可以打包成一个 jar 文件,java -jar test.jar 执行前需要设置一下程序入口,即在MANIFEST.MF 里面添加如下一句话:Main-Class: test.someClassName

1. 关键字

final

可以修饰类,方法和成员变量

final修饰的类不能被继承 final修饰的方法不能被覆盖  final修饰的变量是常量,只能赋值一次

覆盖注意事项:

1. 子类方法覆盖父类方法时,子类方法的权限要>=父类

2. 静态方法只能覆盖静态方法

3. 如果父类方法添加final, 则子类重新定义此方法会编译出错

4.在子类方法中可以通过super.method 调用父类方法,当然如果父类方法是private,也是不能调用的(实际上是子类重新定义method,并没

有覆盖父类method,可以认为父类method被隐藏了)

static

     用于修饰成员(成员变量和成员函数),被修饰后的成员具备以下特点:          随着类的加载而加载,随着类的消失而消失          优先于对象而存在          被所有对象所共享          可以直接用类名调用如类名.成员     用于修饰静态代码块: static {...}          随着类的加载而执行,而且只执行一次,可以用于给类进行初始化          注:构造代码块{...}随着对象的构造而执行,而且创建几次就执行几次,可以用于给所有对象进行初始化          静态代码块-->构造函数{super()-->成员初始化-->构造代码块-->后续语句}     使用注意:          静态方法只能访问静态成员          静态方法中不可以出现this, super等关键字          主函数是静态的 this & super     this代表本类对象的引用     super代表一个父类空间     当本类的成员和局部变量同名用this区分     当子父类的成员变量同名用super区分父类

interface 

     当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface. 

     对于接口中的常见成员都有固定的修饰符。

     全局常量: public static final

     抽象方法: public abstract

     类与类之间是继承extends关系;类与接口之间是实现implements关系;接口与接口之间是继承关系,而且接口可以多继承

     类可以在继承一个类的同时实现多个接口

     抽象类的继承,是is a关系,在定义该体系的基本共性内容,接口的实现是like a关系,在定义体系额外功能

     接口类型的引用,用于指向接口的子类对象

2.继承:

在子类的构造函数中第一行有一个默认的隐式语句 super(); 子类中所有的构造函数默认都会访问父类中的空参数的构造函

数。如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super(...)明确要调用父类中哪个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,那么super语句就没有了,因为super和this都只能定义在第一行,所有只能有一个。

但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。

3.多态:

成员变量:

     编译时:参考引用型变量所属的类中是否有调用的成员变量,如果没有则编译失败

     运行时:参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量

成员函数:

     编译时:参考引用类型变量所属的类中是否有调用的函数,如果没有则编译失败

     运行时:参考的是对象所属的类中是否有调用的函数

静态函数:

      编译时:参考引用类型变量所属的类中是否有调用的静态方法

      运行时:参考引用类型变量所属的类中是否有调用的静态方法

      其实对于静态方法,是不需要对象的,直接用类名调用

4.内部类:

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

      外部类要访问内部类,必须建立内部类的对象

      // 直接访问外部类中的内部类中的成员

       outer.inner in = new outer().new inner();

       in.show();

     // 如果内部类是静态的,相当于一个外部类

      outer.inner in = new outer.inner();

       in.show(); 

//如果内部类是静态的,而且成员是静态的

     outer.inner.function();

     // 如果内部类中定义了静态成员,该内部类必须也是静态的

 

 局部内部类

  内部类可以放在局部位置上   内部类在局部位置上只能访问局部中被final修饰的局部变量

匿名内部类

     前提:内部类必须继承或者实现一个外部类或者接口。

匿名内部类其实就是一个匿名子类对象。 格式:new 父类or接口(){子类内容}

注意:如下做法是错误的

 Java Code 

因为匿名内部类这个子类对象被向上转型为了Object类型,而Object类并没有show()的实现

通常的使用场景之一: 当函数参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递

5.异常

函数内容如果抛出需要检测的异常,那么函数必须要声明异常,否则必须在函数内用try catch捕捉,否则编译失败

如果调用到了声明异常的函数,要么try catch 要么throws, 否则编译失败

功能内容可以解决用catch,解决不了用throws告诉调用者,由调用者解决

一个功能如果抛出了多个异常,那么调用时必须有对应多个catch进行针对性的处理

自定义异常时,继承Exception类(编译时异常),或者RuntimeException类(运行时异常)

子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类

如果父类抛出多个异常,那么子类只能抛出父类异常的子集。如果父类方法没有抛出异常,那么子类覆盖时绝对不能抛

6.访问权限

包与包之间的类进行访问,被访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的。

               public         protected          default                 private

同一类中    ok              ok                    ok                       ok

同一包中    ok              ok                    ok           

子类中       ok              ok              

不同包中    ok

7.线程

创建线程的第一种方式:继承Thread类。

创建线程的第二种方式:实现Runnable接口。

1, 定义类实现Runnable接口。

2, 覆盖接口中的run方法,将线程的任务代码封装到run方法中。

3, 通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。

为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。

所以要在线程对象创建时就必须明确要运行的任务。

4, 调用线程对象的start方法开启线程。

实现Runnable接口的好处:

1, 将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务的封装成对象。

2, 避免了java单继承的局限性。

所以,创建线程的第二种方式较为常用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏浪淘沙

java初级笔记----final、static、匿名对象、内部类

一、final 1、final可以用来修饰类,方法,成员变量, 2、final修饰类不可以被继承,但是可以继承其他类。 3、final修饰的方法不可...

1163
来自专栏java技术学习之道

String类的不可变性

1183
来自专栏函数式编程语言及工具

Akka(7): FSM:通过状态变化来转换运算行为

  在上篇讨论里我们提到了become/unbecome。由于它们本质上是堆栈操作,所以只能在较少的状态切换下才能保证堆栈操作的协调及维持程序的清晰逻辑。对于比...

6118
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十天 IO-异常file类【悟空教程】

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

1075
来自专栏康怀帅的专栏

PHP 面向对象

面向对象三大特性:封装、继承、多态。 官方文档:http://php.net/manual/zh/language.oop5.php 要创建一个类的实例,必须使...

2927
来自专栏无题

JAVA中Object类中的方法以及finalize函数作用

这篇文章对Object中所有的函数进行总结和梳理。Object是所有类的父类,任何类都默认继承Object。 Object是所有类的父类,任何类都默认继承Ob...

3649
来自专栏行者常至

009. golang 函数 function

543
来自专栏IT可乐

Java关键字(三)——static

  我们说Java是一种面向对象编程的语言,而对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,便是Java中的类,我们可...

622
来自专栏xingoo, 一个梦想做发明家的程序员

【面试虐菜】—— JAVA面试题(3)

1 throws与throw的区别 解析:throws和throw是异常处理时两个常见的关键字,初级程序员常常容易正确理解throw和throws的作用和区别,...

1738
来自专栏Janti

干货——详解Java中的关键字

在平时编码中,我们可能只注意了这些static,final,volatile等关键字的使用,忽略了他们的细节,更深层次的意义。

873

扫码关注云+社区