java OOP
<span style="color:#333333">super方法为何放在代码最前</span><span style="color:#333333"> 子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,因为在ja
<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 为集合框架算法类
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)同步代码
更多推荐
所有评论(0)