博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java的一些基础知识
阅读量:6953 次
发布时间:2019-06-27

本文共 3905 字,大约阅读时间需要 13 分钟。

hot3.png

1。关于java的值引用对象引用

    java语言采用的总是值引用(传递参数的方式),即方法得到的是所有参数值的一个拷贝。所以方法不能修改传给它的任何参数变量的内容。

   然而方法参数有两种:值类型和引用类型。对于引用类型,java传递的是引用的拷贝。所以方法可以改变这个对象参数的状态(对象的某个值改变),但是不能实现让一个对象参数引用一个新的对象(对象参数的拷贝可以指向一个新的对象)。

例如:

package CiteTest;//主要验证java的值引用和对象引用public class Cite{     public String dataString;          public Cite(String datastring)     {         this.dataString=datastring;     }}package CiteTest;public class TestDemo{    public static void main(String[] args)    {        Cite aCite=new Cite("Alice");        Cite bCite=new Cite("Bob");        Print(aCite,bCite);        swap(aCite,bCite);        Print(aCite,bCite);            }        public static void swap(Cite aCite,Cite bCite)    {        Cite tempCite=aCite;        aCite=bCite;        bCite=tempCite;        System.out.println("hanshuzhong acite:"+aCite.dataString);        System.out.println("hanshuzhong bcite:"+bCite.dataString);    }        public static void Print(Cite aCite,Cite bCite)    {        System.out.println("acite:"+aCite.dataString);        System.out.println("bcite:"+bCite.dataString);    }    }

结果如下:

acite:Alice

bcite:Bob
hanshuzhong acite:Bob
hanshuzhong bcite:Alice
acite:Alice
bcite:Bob

如果测试改变的话:

 

public static void change(Cite aCite)    {            aCite.dataString="hello";    } Cite aCite=new Cite("Alice");         Print(aCite);        change(aCite);         Print(aCite);

结果为:

acite:Alice

acite:hello
2。重载

重载是函数的名字相同,函数的参数不同。而不同的函数是的标志是函数的签名不同。函数的签名是指函数的名字和函数的参数类型,不包括函数的返回类型。

3.构造器

java仅当类中没有任何构造器的时候才会提供默认无参数的构造器。

4.继承

子类继承父类之后,可以调用父类的protect和普public方法,也可以覆盖父类已有的方法。子类需要调用父类的同名方法是,加super关键字。如果使用super构造器调用超类构造器,必须是子类构造器的第一条语句。

当子类的构造器没有显式的调用超类的构造器,则将自动调用超类默认的(无参)构造器。如果超类中没有无参的构造器,而在子类中构造器没有显式调用超类的其他构造器,则java编译器将报告错误。

子类 is a 父类,所以 父类=子类成立,即子类可以指向父类。

5.多态动态绑定

概念: 一个对象变量可以引用多种实际类型的现象被成为多态。而在运行时能够自动的选择调用哪个方法的现象称为动态绑定。

  • java中不需要将方法声明为虚拟方法。动态绑定是默认的处理方式。如果不需要让一个方法具有虚拟特征,可以将它标记为final属性。

  • 如果调用的方法为private,static,final方法或者是构造器,编译器可以准确的知道应该调用那个方法,这种调用方式称为静态绑定。与此对应的是调用的方法依赖于隐式参数的类型,并且在实际运行时实现动态绑定。

调用对象方法的执行过程:

  1. 编译器查看对象的声明类型和方法名。假设调用x.f(param),隐式参数x声明为C类的对象。编译器会列举所有C类中名为f的方法和其超类中访问属性为public且名为f的方法。

  2. 编译器查看调用方法时提供的参数类型。根据参数类型找到与其完全匹配的方法,选择这个方法。这个过程叫做重载解析。可以存在类型转换,例如;int到double,子类到父类。如果没有找到或者找到多个,则报错。注意:如果子类中一个函数签名和超类方法签名一样,则子类中的方法覆盖这个父类中的方法。返回类型不属于签名。如果返回类型不一样,但是兼容,成为两个方法具有可协变的返回类型。所以查找的方法是现在当前类的方法查找,没有的话再查找超类中的方法。

  3. 出现任何超类的地方都可以被子类替换。

    例:

    父类为employee,子类为manager,子类中有方法setbonus而父类中没有。

  4. manager boss=new manager(..);employee[] staff=new employee[3];staff[0]=boss;boss.setbonus(); //对staff[0].setbonus();  //错误

         因为staff[0]被声明为employee类型,这个类中没有setbonus,所以会出错。写法错误。对于子类和父类中都存在的方法,看对象是什么。

6.类型转换

   对象类型转换之前最好判断一下,用instanceof。

7.抽象类

   抽象类可以包含具体的方法实现,如果这个类中有一个抽象方法,就得将类定义为抽象类。抽象类不能实例化。

8.object中的方法

  1. equal方法

    用来检测一个对象是否等于另外一个对象。主要是判断两个对象是否具有相同的引用。如果具有相同的引用就一定相等。可以用getclass,但是无法对比数据。不行。instanceof检测又不可以对称。

  2. hashcode()

    每个对象都具有一个散列值,即hashcode。一般为对象的存储地址。字符串的散列码由内容导出。但是Stringbuffer类没有定义散列码,他又object的类中的散列码定义。如果重载equal,必须重载hashcode

9.数组中的元素

   一旦确定了数组的元素的个数,使用trimToSize()来调整空间大小。

10.反射

   反射:能够分析类能力

    再运行时查看对象,分析类,实现method对象,操作数组

    运行时得到一个对象,也可以得到对象的类名:

    Employee e;

    e.getClass().getName();              //得到对象的类名

   Class c=Class.forName(classname); //用类名得到类,类名要包括包名

   用处:

   if(e.getClass()==Employee.class)

   e.getClass().newInstance();

   class内的方法:

  getFields(),getDeclareFields(),getMethods(),getConstructors();

11.java中的泛型

 
class
 

public class pair
{}  public class pair
{}

 

方法
 

public static 
 T getmiddle(T[] a)

 

<T>放在修饰符的后面,返回类型的前面。

泛型限定:

例如:

&分割限定类型,限定类型可以有类,但是类必须是第一个限定符。

无论何时定义一个泛型类型,都会提供一个对应的原始类型。原始类型对应的名字就是删去类型参数后的泛型类姓名。擦出类型变量,替换为限定类型。

如:

<T extends Compareble & Serializable> T替换为Compareble

getclass(),返回的是原始类型。

所以ArrayList<String>,和ArrayList<Double>的getclass方法都是返回一样的ArrayList.class

禁止使用参数化类型的数组,如:pair<String>[] name=new pair<String>[10];

泛型不能new,不能做数组。

泛型的通配符,如:public static void printBuddies(Pair<? extends Employee> p)

另外一种形式:

Pair<? super Manager>表示限定为Manager的所有超类型

转载于:https://my.oschina.net/ashan2012/blog/224374

你可能感兴趣的文章
Linux使用du和df查看磁盘和文件夹占用空间
查看>>
CentOS 6.6 MySQL install
查看>>
从零开始用gulp
查看>>
android之Activity的生命周期
查看>>
hadoop2.4 支持snappy
查看>>
STL 笔记(四) 迭代器 iterator
查看>>
2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
查看>>
[LeetCode] Valid Parenthesis String 验证括号字符串
查看>>
各大SRC中的CSRF技巧
查看>>
Docker for Windows 使用入门
查看>>
【Django】Web应用开发经由
查看>>
SpringBoot(九)-- SpringBoot JDBC
查看>>
Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合
查看>>
基于Centos搭建nginx+uwsgi运行django环境
查看>>
context switch
查看>>
Oracle awr报告生成操作步骤
查看>>
【DB2】DB2使用IMPORT命令导入含有自增长列的表报错处理
查看>>
微服务之springCloud-docker-comsumer(三)
查看>>
dhcpcd守护进程分析【转】
查看>>
Linux - 理不清的权限chmod与chown区别
查看>>