zoukankan      html  css  js  c++  java
  • Java笔记

    书本总是喜欢用冗长的代码来描述,不方便快速复习。所以摘下要点,方便复习。

    一、基本语法以及操作符

    二、访问权限

    Public

    private

        protect 子类可以访问父类受保护成员

    不过不声明以上三种,就默认为default,

    权限为在同一个包内可以访问。

    不管是何种权限,在同一个类里面是都能访问到的。

    也就是在类的实现里面都可以访问即使是已经实例化的对象。

    三、复用类

    1、  组合,在类里面使用其他的类。

    2、  继承。

    无法继承父类的private内容,也就是父类的private内容对子类不可见,但是若父类对其拥有一个public方法的调用,子类仍然可以通过调用此public方法使用父类private方法。

    初始化顺序:

    a 静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)

    b 普通成员初始化

    c 执行构造函数。

     

    1 继承体系的所有静态成员初始化(先父类,后子类)

    2 父类初始化完成(普通成员的初始化-->构造函数的调用)

    3 子类初始化(普通成员-->构造函数)

    类的加载,类只有被用到的时候才会被加载,且只初始化一次。

     

    Super用来引用父类方法(仍旧无法访问private)。和显式的调用父类构造器

     

    Java不允许多重继承,但使用了接口实现了多重继承

    3、  多态

    实现多态的途径之一就是向上转型。

    就是子类,或者实现了一些接口的类,都可以使用父类或者那些接口去代替他本身的引用。

    向上转型的时候,父类的接口是无法访问子类里新增的方法和属性的。

    4、  接口,接口就是将声明和实现分割开来,使用interface修饰。

    与之对应的是抽象类,其中一些方法使用Abstract,强制子类实现它的方法。

    与之相关的是各种设计模式。

    四、容器

    l   Collection子接口之一:Set接口

    • Ø HashSet   LinkedHashSet   TreeSet

    l   Collection子接口之二: List接口

    • Ø ArrayList  LinkedList  Vector

    l   Map接口

    • Ø HashMap  TreeMap  Hashtable

    集合支持遍历,需要继承Iterable的接口,并实现其next和hasNext方法。

    TreeMap的排序需要继承comparable接口实现其compareto,或者实现一个comparator对象,为这个对象实现compare的方法。

    当要在map中写入自己定义的类的时候,要重写这个类的equal方法和hasCode方法。

    容器的具体方法参考文档。

    五、异常

    建议使用try catch的方法捕获异常

    自己实现异常

    手动抛出异常 throw

    六、String类

    String,StringBuffer与StringBuilder的区别

    String 字符串常量
    StringBuffer 字符串变量(线程安全)
    StringBuilder 字符串变量(非线程安全)

     String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String

    StringBuffer

             StringBuilder都有append方法,可以直接增加字符串。

    格式化字符串:

    1.         int x = 1;  
    2.         float y = 1.223f;  
    3.         System.out.printf("%d %f",x,y);  
    4.         System.out.println();  
    5.         System.out.format("%d %f",x,y); 

    可以用Formatter在控制台完美的控制间隔,不用你自己去数几个空格了。

    [java] view plaincopy

    1. public class TestString {  
    2.     public static void main(String[] args) {  
    3.         Formatter fm = new Formatter(System.out);  
    4.         fm.format("%-5s %5s %10s ", "Name","Age","School");  
    5.     }  
    6. }  

    %数字+s这样的表达像c,位置可以移动。

     

    [java] view plaincopy

    1. System.out.println(String.format("%h", 17));  
    2. nbsp;fm.format("%h", 17);  

    16进制的格式化输出。

    正则表达式:

          不用真心熟悉不起来,跳过。

    七、类型信息

    每一个类都对应着一个Class对象。

    • Ø 在运行时判断任意一个对象所属的类
    • Ø 在运行时构造任意一个类的对象
    • Ø 在运行时判断任意一个类所具有的成员变量和方法
    • Ø 在运行时调用任意一个对象的成员变量和方法
    • Ø 生成动态代理
    • Ø Class本身也是一个类
    • Ø Class 对象只能由系统建立对象
    • Ø 一个类在 JVM 中只会有一个Class实例
    • Ø 一个Class对象对应的是一个加载到JVM中的一个.class文件
    • Ø 每个类的实例都会记得自己是由哪个 Class 实例所生成
    • Ø 通过Class可以完整地得到一个类中的完整结构

    方法名

    功能说明

    static Class  forName(String name)

    返回指定类名 name 的 Class 对象

    Object newInstance()

    调用缺省构造函数,返回该Class对象的一个实例

    getName()

    返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称

    Class getSuperClass()

    返回当前Class对象的父类的Class对象

    Class [] getInterfaces()

    获取当前Class对象的接口

    ClassLoader getClassLoader()

    返回该类的类加载器

    Class getSuperclass()

    返回表示此Class所表示的实体的超类的Class

    Constructor[] getConstructors()

    返回一个包含某些Constructor对象的数组

    Field[] getDeclaredFields()

    返回Field对象的一个数组

    Method getMethod(String name,Class  …  paramTypes)

    返回一个Method对象,此对象的形参类型为paramType

    实例化Class类对象(四种方法)

    1)前提:若已知具体的类,通过类的class属性获取,该方法

                        最为安全可靠,程序性能最高

           实例:Class clazz = String.class;

    2)前提:已知某个类的实例,调用该实例的getClass()方法获

                        取Class对象

           实例:Class clazz = “www.atguigu.com”.getClass();

    3)前提:已知一个类的全类名,且该类在类路径下,可通过

           Class类的静态方法forName()获取,可能抛出ClassNotFoundException

           实例:Class clazz = Class.forName(“java.lang.String”);

    4)其他方式(不做要求)

    ClassLoader cl = this.getClass().getClassLoader();

    Class clazz4 = cl.loadClass(“类的全类名”);

    实现了动态代理:

             待补

    八、泛型

    Java泛型没有其它语言的泛型那么有用,原因之一就是使用了擦除。擦除的核心动机是使得泛型化与非泛型化的代码之间能互相调用,是为了兼容。Java的设计者认为这是唯一可靠行的解决方案。如果Jdk1.0就引入了泛型,则不会有这个问题。

    Java的泛型因为历史的遗留问题,所以实行了擦除的原理。即所有类都在运行期间都将自动擦除成Object对象,丢失其原有的对象信息

    泛型方法 : public<T> void f(T x){}

    擦除。List<String>型的对象与List<Integer>型的对象,在运行时,其类型都被擦除为List。因此,在泛型机制下,无法获得有关泛型参数的运行时信息,像List<Integer>成为List,普通类型T则成为Object类型。这相比c++的模板机制,有很大的不足之处,弥补方法之一是使用泛型边界如<T extends ClassType>。

    边界Java泛型编程中使用extends关键字指定泛型参数类型的上边界(重写了extends关键字,与继承没有什么关系)

    Java泛型编程的边界可以是多个,使用如<T extends A & B & C>语法来声明,其中只能有一个是类,并且只能是extends后面的第一个为类,其他的均只能为接口

    泛型通配符:

    有个古怪循环,没搞懂什么意思,好像什么子类限定,自己限定自己子类的泛型?

    以后再研究。

    九、并发

    Executor 懒得补以后写。

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/You0/p/4794835.html
Copyright © 2011-2022 走看看