<span style="color:#333333">super方法为何放在代码最前</span>
<span style="color:#333333">    子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,因为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。</span>

 

举个栗子

定义父类House,构造函数中要初始化成员door的高度。 

如果子类Church的door比较高,如果我们先初始化子类的door的高度,后使用super来初始化通用属性,子类定义好的属性就会被覆盖。

 

final 修饰属性 常量 只能赋值一次
final 修饰类 密封类 不能被继承

static java中 类名和对象均可调用
方法中不可有 static 变量
C# 中被 static 修饰 则不能被对象所调用

封装 将类的某些信息隐藏在类内部,不允许外部程序直接访问
而是通过该类提供的方法来实现对隐藏信息的操作和访问

this调用构造方法 this();//如果使用必须是第一条语句

 

 

static

普通类是不能用static来修饰的,static只能用来修饰内部类。使用static修饰内部类之后可以使用“类.内部类”实例化这个内部类的对象。

C#则可以

 

static变量

按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。静态变量与实例变量的区别主要是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而实例变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static方法

static方法也叫静态方法,也可以直接使用“类.方法()”来直接调用。但是需要注意一下几点:一是静态方法中不能使用this和super关键字;二是静态方法中不能使用非静态成员变量,也不能调用非静态方法;三是静态方法与静态变量一样都是独立于任何实例,所以静态方法不能使用abstract修饰,即static方法不能为抽象方法。

 

java 中普通方法可以和类名相同

 

c#不可

 

继承实现代码重用
java 继承 派生类 extends 基类
调用父类成员 super
在子类构造函数中如果显式调用父类构造函数时
必须在第一条
C# 继承 派生类 : 基类
调用父类成员 base
访问父类成员
均为单继承


 

java:

继承 extends

继承 public 和 protected 修饰的属性和方法,无论子类和父类是否在同一个包里

继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里

无法继承 private 修饰的属性和方法

无法继承父类的构造方法

继承初始化数据顺序
父类属性>父类构造方法>子类属性>子类构造方法
重写的前提>父类具有能被重写的方法>>继承
重写时 子类的重写方法访问修饰符不能比父类的重写方法小
abstract class A{
public abstract void show();
}
class B extends A{
//父类为 public 子类须为 public
private void show(){}
//方法不能被重写
public final void AA(){}

}

子类构造函数默认调用父类无参构造函数 若父类没有无参构造函数 则编译错误

 

实现多态思路
具有继承关系的父类和子类
子类重写父类方法
父类的引用指向子类的对象


实现多态形式
使用父类作为方法形参实现多态
使用父类作为方法返回值实现多态


instanceof 运算符
对象 instanceof 类或接口//返回值boolean C#中 is

 

接口 interface
接口没有构造方法
接口中均为抽象方法
接口中方法都是
public abstract


接口不可以被实例化
实现类必须实现接口的所有方法
实现接口可以实现多个接口(实现相当于mod dlc)
接口中的变量都是静态常量 public static final


实现接口
implements


 

public class A implements USB,HDMI,...{}

 

C#接口

 

实现 :

语法和继承类似 为 " : "

 

无静态成员
不能显式加 public

 

 

 

 

 

 

try catch finally throw throws

如果try块中所有语句正常执行完毕,不会发生异常。那么catch块中的所有语句都将会被忽略

如果try语句块在执行过程中遇到异常,并且这个异常与catch中的声明的一行类型相匹配,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行。匹配是指catch所处理的异常类型所生成的异常类型完全一致或是他的父类

如果try语句块在执行过程中遇到异常,而抛出的异常在catch块里面没有被声明,那么程序立刻退出

try{

}catch(NullPointerException e){

}catch(Exception e){

}finally{

}

...

try 发生异常只进入一个 catch

finally 中的语句始终执行,只有一种情况不执行

System.exit(0);//终止 JVM 释放内存

//关于System.exit(0) https://blog.csdn.net/hanglife/article/details/80669547

异常对象常用方法

void printStackTrace():

输出异常的堆栈信息。堆栈信息包括程序运行到当前类的执行流程,(直到 main)

String getMessage():

返回异常信息描述字符串。该字符串描述异常产生的原因,是printStackTrace()方法方法输出信息的一部分

 

执行过程

如果try块在执行过程中遇到异常,那么在try块中其余剩下的代码都将被忽略,系统自动生成相应的异常对象,包裹异常的类型、异常出现时程序的运行状态及对该异常的详细描述。如果这个异常对象与catch中声明的异常类型相匹配,则会把该异常对象赋给catch后面的异常参数,相应的catch块将会被执行

 

throws 声明异常 多个异常使用逗号隔开

声明异常后

通过 try-catch 捕获并处理异常

通过 throws 继承声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将由Java虚拟机来处理. 

抛出异常

new throw Exception(String Message);

 

 

 

Collection 为接口 Set 和 List 为继承他的接口,Map为接口

Collections 为集合框架算法类

java 集合框架详解

 

 

Thread 

创建线程的两种方式

1.继承 Thread 类,重写run方法

2.实现 Runnable 接口,实现run方法,

 

启动方式

创建子线程对象

Thread t = new Thread(new MyThread() , "怕怕");

创建 Thread 类对象传入子线程类 并指定了线程名为怕怕

//java 中继承只能单继承 拓展来说推荐实现Runnable

常用方法

currentThread() //获取当前线程

join() 停止当前线程执行 异常 InterruptedException e

例:t为子线程 在main中运行

t.join();

则 main 停止 其他线程执行 和调用对象无关系.

//重载方法传入等待时间在运行 单位 ms

join(0) 为等待无限时间

joint(0) 等价于 join()

static sleep( t ms)  异常 InterruptedException e

//调用线程停止 t 为传入时间 单位 ms

setPriority() //设置线程优先级别 1-10 默认 5 , 1 最小 10最大

getPriority() //获取线程

static yield() //暂停当前线程 执行其他线程 不能保证一定礼让

interrupt()  //停止当前线程

Boolean isAlive() //线程是否执处于活动状态

多线程

如果在一个进程中同时运行了多个线程,用来完成不能的工作则为 "多线程"

多个线程交替占用CPU资源 ,而非真正的并行执行

 

线程状态

创建>就绪>阻塞>运行>死亡

使用 synchronized 实现同步

 

多个并发线程访问同一资源的同步代码块时

同一时刻只能有一个线程进入synchronized(this)同步代码块

当一个线程访问一个synchronized(this)同步代码块时,其他synchronized(this)同步代码块同样被锁定

当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐