《Java基础复习》—类与对象&初始化

关于类和对象的基本理念,就不再赘述(如果你学习过还忘了,就是一种特殊的本领了),没有学习过的可以去搜索一下OOP或者类和对象,百科的知识就已经足够了,不必重复。

这里的讲解由浅入深,我会在分块前做好标注,区分初学者与复习者所需要了解的部分,有基础的可以不再看(基础部分)标注的部分

随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主要原因之一。——《Java编程思想》

这是一句揭示了Java为什么能稳居排行第一(目前2020年)的原因之一。也就是Java虚拟机与GC(垃圾回收)的神奇之处。本文不深入探讨虚拟机相关知识

一、Java类的最基础的结构

这里先说最基础的结构,随着文章的叙述,会不断扩充这个类

Java使用关键字class来定义一个类,如下

首先你要养成良好的习惯,使用驼峰式命名,开头要大写

注意Java中只有Class的开头才是大写的,其他的标识符都为小写。

class Aclass{
int num1;
void function(num){
num1=num;
System.out.println(num1);
}
}

在Java中,类中包含的信息,如这个num1,被称为属性,类中的函数被称为方法

该函数的返回类型是void,当然也可以为其他类型,Java还允许返回值为对象,集合。

这就是一个类的基本结构了,那如何使用这个类?

二、初始化

**===================================**

(基础部分)

如上我们编写了一个类,但是有一点你需要知道的是,你所编写的只是一个模板,要想投入你的程序使用,需要生成对应的对象。也就是,在内存中创建属于这个类的空间(位于堆上)。

现在,你需要生成一个对象,按照上面的思路,你至少需要一个能分配内存空间的初始化方法,我们假设为initialize()方法

正如这个方法的名称,我们在调用一个类之前,都需要调用initialize()方法。通过调用initialize()方法,我们可以搭建一个构造器,保证所有的对象都会得到初始化。

所以我们需要一个独特的方法,不能与成员名称冲突,可被编译器识别。故Java采用了与C++类似的方案:构造器采用与类相同的名称

注意要与类名完全相同!

现在为之前的类加上构造器

class Aclass{
int num1;
void function(num){
num1=num;
System.out.println(num1);
}
Aclass(){
System.out.println("初始化了Aclass类");
}
}

如何操作实现初始化呢?

new Aclass();
/*
out:
初始化了Aclass类
*/

Java本质上只有一种初始化的方法—构造器初始化,这与C++不同

上述的语句初始化了一个Aclass类的对象并返回。

即new Aclass()的返回类型为一个新的对象。

不接受参数的构造器叫无参构造器(Java文档中的叫法),也有人叫做默认构造器(C++的叫法)

上面的例子中就是一个无参构造器,注意,构造器只有小括号,不要用大括号yy了,Java用到大括号的地方只有函数块的划分。

我们稍加修改,修改为一个有参数的构造器

class Aclass{
int num1;
void function(num){
num1=num;
System.out.println(num1);
}
Aclass(int num){
System.out.println("初始化了Aclass类,参数为"+num);
}
} Aclass t = new Aclass(3);
//out: 初始化了Aclass类,参数为3

这里我们接触到了一个新语句

Aclass t = new Aclass(3);

Aclass t 是Aclass类的一个引用,表示我们将要用到Aclass的一个对象,名为t,但是还没有被初始化。我们使用new Aclass()构造一个新的对象,并返回,通过赋值语句,赋值给Aclass类的一个引用t。此时t就表示了新建的这个对象

**===================================**

(易错点)

如果没有定义构造器,Java编译器会生成一个默认的无参构造器,该构造器创建的类中,属性为0或null。

如果Aclass(int num)是Aclass类唯一的构造器,那么编译器将不会允许你以其他任何方式创建Aclass对象

举例

class Aclass{
int num1;
void function(num){
num1=num;
System.out.println(num1);
}
Aclass(int num){
System.out.println("初始化了Aclass类,参数为"+num);
}
} Aclass t = new Aclass();
//out: 编译器报错:找不到构造器Aclass()

(重要)

三、方法重载

在上面的例子中,我们定义了有参数的构造方法后,Java创建对象似乎就只能永远使用这个构造方法了,我们希望他同时也能使用默认构造方法,怎么办?

为了让方法名相同参数不同的方法同时存在,必须使用方法重载

下面是例子

class Aclass{
int num1;
void function(num){
num1=num;
System.out.println(num1);
}
Aclass(){
System.out.println("无参构造器,参上!");
}
Aclass(int num){
System.out.println("初始化了Aclass类,参数为"+num);
}
} Aclass t = new Aclass(3);
Aclass another = new Aclass();
/* out:
初始化了Aclass类,参数为3
无参构造器,参上!
*/

方法重载确确实实的解决了我们的需要,那这么多名字相同的方法,编译器如何区分?

3.1区分重载的方法

答案:每个重载的构造必须有一个独一无二的参数类型列表

只要参数不同,编译器就会视作不同的方法。

对于普通方法,返回类型也是一个作为划分的办法

即:返回类型,参数、参数的顺序 完全相同的方法才是同一个重复的方法,否则就为重载

(重点)

3.2涉及基本类型的重载

基本类型可能从“较小”的类型自动提升至一个“较大的类型”,此过程如果涉及重载,可能会造成混淆。

这里的大小,指的是范围的大小

在不使用重载的情况下,向一个接受float的方法传入一个int类型,该实参会被自动提升到float类型。

在使用重载的情况下,我们先看下面的例子

void f1(int num) { println("int");}
void f1(char num) { println("char");}
void f1(float num) { println("float");} f1(5);
/*
out: int
*/

我们看到编译器选择了对应int的方法,但是我们如果没有这个int呢?

void f1(long num) { println("long");}
void f1(char num) { println("char");}
void f1(float num) { println("float");} f1(5);
/*
out: long
*/

我们看到选择使用了long类型的方法

总结一下:

如果有某个方法接受int型参数,他就会被调用。如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升提升到可用的最小的等级,如float、long中选择了long。

另外,char 类型略有不同,如果无法找到恰好接受char类型参数的方法,就会把char直接提升到int型

这是小数据填入了接受较大数据的方法中,那如果传入的实际参数大于重载方法声明的形式参数,会出现声明情况?

答案:编译器报错!!,如果你非要这么干,你需要使用类型装换操作符,同时会可能伴有精度的损失

四、this关键字

简单来说,this关键字是当前对象的引用

(重要)

若有同一类型的两个对象,分别是a,b他们都有一个方法是fun(),它如何知道被a还是被b所调用的呢?

下面是一个例子

class Father{
void fun(int num){
System.out.println("abc"+num);
}
}
public class UseC {
public static void main(String[] args){
Father a = new Father(),b = new Father();
a.peel(1);
b.peel(2);
}
}

你可能要杠了,我调用的是a对象的方法,与b对象何干?

这里学习了Java的虚拟机你会了解的更多。你可以暂时这样理解:

Java在存储对象的时候,存储的是这个对象独有的信息(值等),而共有的信息(如方法,静态常量)则作为类的信息存储在方法区中,这两种信息存储的位置完全不同。

为了达到“发送消息给对象”的目的,编译器在幕后做了一系列操作。它暗自将“所操作对象的引用”作为第一个参数传递给peel()

所以,代码中的方法调用就变成了这样:

Father.peel(a,1);
Father.peel(b,2);

this关键字只能在方法内部使用,表示“调用方法的对象”的引用。

但是在方法内部调用同一个类中的另一个方法,就不必使用this。

另外this关键字可以作为返回值,用来传递当前的对象给其他方法很好用。

4.1构造器中调用构造器

情景:我们希望在当前的构造器中使用到其他构造器的功能

解决方案:利用this

在构造器中,如果为this添加了参数列表,那么this将产生对符合此参数列表的某个构造器的明确调用。

使用this调用构造参数的注意

  1. 只能在构造器中调用
  2. 只能调用一次
  3. 只能在方法的开始调用

下面是标准demo

public class Test(){
Test(int num){
System.out.println(num);
}
Tset(){
this(num);
System.out.print("function2");
}
}

4.2static含义

static就是没有this的方法

static内部不能调用非静态的方法,而非静态的方法能调用static方法。

Java禁止使用全局方法,但置入static方法就可以问其他static方法和static域,使用时是不符合面向对象的(“向对象发消息”)。

Java构造方法的姿势与易错点的更多相关文章

  1. 关于java学习中的一些易错点(基础篇)

    由JVM来负责Java程序在该系统中的运行,不同的操作系统需要安装不同的JVM,这样Java程序只需要跟JVM打交道,底层的操作由JVM去执行. JRE(Java Runtime Environmen ...

  2. 【笔试题】Java 易错题精选

    笔试题 Java 易错题精选 1.写出下列程序的运行结果( )String 不变性Java 值传递 public class Test { public static void main(String ...

  3. Java五道输出易错题解析(避免小错误)

    收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了. 1. 看不见的空格? 下面的输出会正常吗? package basic; public class Integ ...

  4. 细节!重点!易错点!--面试java基础篇(二)

    今天来给大家分享一下java的重点易错点第二部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.字符串创建与存储机制:当创建一个字符串时,首先会在常量池中查找是否已经有相同的字符串被定义,其判断 ...

  5. 细节!重点!易错点!--面试java基础篇(一)

    今天来给大家分享一下java的重点易错点部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.java中的main方法是静态方法,即方法中的代码是存储在静态存储区的. 2.任何静态代码块都会在ma ...

  6. 【经验总结】Java在ACM算法竞赛编程中易错点

    一.Java之ACM易错点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...

  7. Java五道输出易错题解析(进来挑战下)

    转自:http://blog.csdn.net/lanxuezaipiao/article/details/41985243 收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注 ...

  8. 《java入门第一季》之面向对象(一个易错面试题)

    这个面试题有点难度,有一些饶.不明白可以在下面讨论.还是值得搞懂的. / * 看程序写结果: A:成员变量的问题 int x = 10; //成员变量x是基本类型 Student s = new St ...

  9. Java字符串易错方法总结

    Java字符串易错方法总结 public String[] split(String regex) 和 public String[] split(String regex,int limit) li ...

随机推荐

  1. Java 抽象类 抽象方法 使用说明

    知识点 什么是抽象类 抽象类与普通类主要两点不同: 1.在类的修饰符后面多了一个abstract关键字 2.抽象类是不允许通过new来实例化的 由于抽象类不能通过new来实例化,所以基本上是在继承中当 ...

  2. GPS轨迹发生模拟器介绍

    GPS轨迹发生模拟器介绍 GPS信号模拟器能够模拟卫星信号运动轨迹,模拟GPS卫星导航系统的导航信号.GPS轨迹发生器可以模拟导航系统确定位置点如日期.时间.经度.纬度.海拔信息.速度等.GPS轨迹模 ...

  3. 神奇的 SQL 之扑朔迷离 → ON 和 WHERE,好多细节!

    开心一刻 楼主:心都让你吓出来了! 狮王:淡定,打个小喷嚏而已 前情回顾 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一)中,我们讲到了 3 种联表算法:SNL.BNL 和 I ...

  4. Ubuntu部署Asp.net core网站无法访问

    前几天应工作需要,在阿里云上部署一个测试站点.本以为分分钟的事情,没想到打脸了. 当时直接新建一个webapi项目,publish后直接上传到阿里云,随后设置nginx转发网站端口5000. 接着打开 ...

  5. swoole模块的编译安装:php编译安装swoole模块的代码

    本篇文章给大家带来的内容是关于swoole模块的编译安装:php编译安装swoole模块的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.下载swoole 1 wget ht ...

  6. 【.net core】电商平台升级之微服务架构应用实战

    一.前言 这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享.微服 ...

  7. JVM进阶:JVM的监控利器

    每次聊起性能测试,最后的终极话题就是怎么做优化.其实在Java的复杂项目中都会有内存不足问题.内存泄露问题.线程死锁问题.CPU问题.这些问题在小压力的情况下有可能并不明显,很容易被忽视.但是真正到了 ...

  8. Block详解一(底层分析)

    本篇博客不再讲述Block的基本定义使用,最近而是看了很多的block博客讲述的太乱太杂,所以抽出时间整理下block的相关底层知识,在讲述之前,提出几个问题,如果都可以回答出来以及知道原理,大神绕过 ...

  9. ECNU 计算机系统 (CSAPP) 教材习题作业答案集

    这里是华东师范大学计算机系统的作业答案.由于几乎每一年布置的习题都几乎相同,网上的答案又比较分散,就把自己上学期提交的作业pdf放上来了,供参考. 长这样 Download Link:http://c ...

  10. 大数据软件安装之Azkaban(任务调度)

    一.安装部署 1.安装前准备 1)下载地址:http://azkaban.github.io/downloads.html 2)将Azkaban Web服务器.Azkaban执行服务器.Azkaban ...