this变量

在方法内部,可以使用一个隐含的变量this,它始终指向当前实例。如果没有命名冲突,可以省略this。

但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this。

构造方法

要特别注意的是,如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法。

如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来。

方法重载

这种方法名相同,但各自的参数不同,称为方法重载(Overload)。

注意:方法重载的返回值类型通常都是相同的。

重载(overload)与重写(override)不同

Override和Overload不同的是,如果方法签名如果不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override。

方法名和形参列表共同组成方法签名。https://blog.csdn.net/ftell/article/details/80527159

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。

条件为

1.数列表必须完全与被重写方法的相同。

2.返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。

3.访问权限*不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

4.父类的成员方法只能被它的子类重写。

5.声明为 final 的方法不能被重写。

6.声明为 static 的方法不能被重写,但是能够被再次声明。

7.子类和父类在
同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。

8.子类和父类
不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法

9.重写的方法能够抛出任何
非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

10.
构造方法**不能被重写。

11.如果不能继承一个方法,则不能重写这个方法。

异常

https://blog.csdn.net/hguisu/article/details/6155636

继承

Java使用extends关键字来实现继承

protected关键字可以把字段和方法的访问权限控制在继承树内部,让子类访问父类的成员,但无法修改。

super关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName。

向上/向下转型

这种把一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)。

父类类型强制转型为子类类型,就是向下转型(downcasting)

区分继承和组合

究其原因,是因为Student是Person的一种,它们是is关系,而Student并不是Book。实际上Student和Book的关系是has关系。

具有has关系不应该使用继承,而是使用组合,即Student可以持有一个Book实例:、

  1. class Student extends Person {
  2. protected Book book;
  3. protected int score;
  4. }

多态

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写/重写(Override)。

抽象类

如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。

因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。

使用abstract修饰的类就是抽象类。我们无法实例化一个抽象类

Person p = new Person(); // 编译错误

抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。

接口

如果一个抽象类没有字段,所有方法全部都是抽象方法:

  1. abstract class Person {
  2. public abstract void run();
  3. public abstract String getName();
  4. }

就可以把该抽象类改写为接口:interface

  1. interface Person {
  2. void run();
  3. String getName();
  4. }

所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)。

当一个具体的class去实现一个interface时,需要使用implements关键字。举个例子:

  1. class Student implements Person {
  2. private String name;
  3. public Student(String name) {
  4. this.name = name;
  5. }
  6. @Override
  7. public void run() {
  8. System.out.println(this.name + " run");
  9. }
  10. @Override
  11. public String getName() {
  12. return this.name;
  13. }
  14. }

我们知道,在Java中,一个类只能继承自另一个类,不能从多个类继承。但是,一个类可以实现多个interface,例如

  1. class Student implements Person, Hello { // 实现了两个interface
  2. ...
  3. }

**接口可以继承

一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。

java8之前接口中的方法默认类型都是public abstract,也就是抽象方法,具体实现都交给实现类。

而java8对接口功能做了增强,增加了default方法和static方法,也就是说从java8开始接口中的方法不再只能是抽象的,也可以有实现。

实现类可以重写default方法,不能重写static方法。

https://www.jianshu.com/p/f8a84c498726

包 jar 模块

要特别注意:包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。

jar文件就是class文件的容器。

模块的重要作用就是声明依赖关系。

======核心类-

1.字符串

2.StringBuilder

3.StringJoiner

4.包装类型

5.JavaBean

6.枚举

7.常用工具类

String

String是一个引用类型。它本身也是一个class。Java字符串的一个重要特点就是字符串不可变

当我们想要比较两个字符串是否相同时,要特别注意,我们实际上是想比较字符串的内容是否相同。必须使用equals()方法而不能用==

Java编译器在编译期,会自动把所有相同的字符串当作一个对象放入常量池

要忽略大小写比较,使用equalsIgnoreCase()方法。

string方法https://www.liaoxuefeng.com/wiki/1252599548343744/1260469698963456

StringBuilder

查看StringBuilder的源码,可以发现,进行链式操作的关键是,定义的append()方法会返回this,这样,就可以不断调用自身的其他方法。

在编译时就自动把多个连续的+操作编码为StringConcatFactory的操作

StringJoiner

类似用分隔符拼接数组的需求很常见,所以Java标准库还提供了一个StringJoiner来干这个事:

  1. public class Main {
  2. public static void main(String[] args) {
  3. String[] names = {"Bob", "Alice", "Grace"};
  4. var sj = new StringJoiner(", ");
  5. for (String name : names) {
  6. sj.add(name);
  7. }
  8. System.out.println(sj.toString());
  9. }
  10. }

如果查看源码,可以发现,StringJoiner内部实际上就是使用了StringBuilder

包装类型

把一个基本类型视为对象(引用类型)?

比如,想要把int基本类型变成一个引用类型,我们可以定义一个Integer类,它只包含一个实例字段int,这样,Integer类就可以视为int的包装类(Wrapper Class):

Bean

在Java中,有很多class的定义都符合这样的规范:

若干private实例字段;

通过public方法来读写实例字段。

例如:

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public String getName() { return this.name; }
  5. public void setName(String name) { this.name = name; }
  6. public int getAge() { return this.age; }
  7. public void setAge(int age) { this.age = age; }
  8. }

如果读写方法符合以下这种命名规范:

  1. // 读方法:
  2. public Type getXyz()
  3. // 写方法:
  4. public void setXyz(Type value)
  5. 那么这种class被称为JavaBean

读写方法合称为属性

JavaBean的作用

JavaBean主要用来
传递数据**,即把一组数据组合成一个JavaBean便于传输。此外,JavaBean可以方便地被IDE工具分析,生成读写属性的代码,主要用在图形界面的可视化设计中。

枚举类

在Java中,我们可以通过static final来定义常量。例如,我们希望定义周一到周日这7个常量,可以用7个不同的int表示:

  1. public class Weekday {
  2. public static final int SUN = 0;
  3. public static final int MON = 1;
  4. public static final int TUE = 2;
  5. public static final int WED = 3;
  6. public static final int THU = 4;
  7. public static final int FRI = 5;
  8. public static final int SAT = 6;
  9. }

为了让编译器能自动检查某个值在枚举的集合内(比如不能有星期八),并且,不同用途的枚举需要不同的类型来标记,不能混用,我们可以使用enum来定义枚举类:

  1. public class Main {
  2. public static void main(String[] args) {
  3. Weekday day = Weekday.SUN;
  4. if (day == Weekday.SAT || day == Weekday.SUN) {
  5. System.out.println("Work at home!");
  6. } else {
  7. System.out.println("Work at office!");
  8. }
  9. }
  10. }
  11. enum Weekday {
  12. SUN, MON, TUE, WED, THU, FRI, SAT;
  13. }

和int定义的常量相比,使用enum定义枚举有如下好处:

首先,enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误。例如,下面的语句不可能编译通过:

  1. int day = 1;
  2. if (day == Weekday.SUN) { // Compile error: bad operand types for binary operator '=='
  3. }

使用enum定义的枚举类是一种引用类型。前面我们讲到,引用类型比较,要使用equals()方法,如果使用==比较,它比较的是两个引用类型的变量是否是同一个对象。因此,引用类型比较,要始终使用equals()方法,但enum类型可以例外

这是因为enum类型的每个常量在JVM中只有一个唯一实例,所以可以直接用==比较

BigInteger大数

如果我们使用的整数范围超过了long型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int[]数组来模拟一个非常大的整数:

  1. BigInteger bi = new BigInteger("1234567890");
  2. System.out.println(bi.pow(5)); // 2867971860299718107233761438093672048294900000

对BigInteger做运算的时候,只能使用实例方法,例如,加法运算:

  1. BigInteger i1 = new BigInteger("1234567890");
  2. BigInteger i2 = new BigInteger("12345678901234567890");
  3. BigInteger sum = i1.add(i2); // 12345678902469135780

BigInteger用于表示任意大小的整数;

BigInteger是不变类,并且继承自Number;

将BigInteger转换成基本类型时可使用longValueExact()等方法保证结果准确

BigDecimal

和BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。

Day1 面向对象编程与Java核心类的更多相关文章

  1. Java核心类

    Java核心类的学习: 常用类库 io流 集合 多线程 网络编程 调试与优化 XML和JSON 枚举.注解和反射 设计模式

  2. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  3. Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...

  4. Java学习day7面向对象编程1-对象和类

    一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...

  5. java面向对象编程——第四章 类和对象

    OO:面向对象 OOP:面向对象编程 OOA:面向对象分析 OOD:面向对象设计 结构化编程:从顶向下,将一个大问题分解成更小的任务,然后为每一个更小的任务编写一个过程.最后程序员会编写一个主过程来启 ...

  6. 【java编程】Java魔法类:Unsafe应用解析

    转载来源:https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html 前言 Unsafe是位于sun.mis ...

  7. JavaScript面向对象编程(2)-- 类的定义

    最近这一段时间事情太多了,没有时间再继续写,幸好这两天有点小闲,先小写一下JavaScript中面向对象一中推荐的方法.本文承接上一篇JavaScript面向对象编程(1) -- 基础. 上篇说过,J ...

  8. 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法

    6.    类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1.   类 6.1.1.    类的定义 package cn.itcast ...

  9. 洗礼灵魂,修炼python(36)--面向对象编程(6)—类的相关内置函数issubclass,hasattr等

    啥?我靠,类也有内置函数?哈哈,确实有的.有哪些呢?请往下看 issubclass(cls, class_or_tuple, /) 1.基本属性: 方法全是特殊方法 2.使用方法:判断一个类是否由另一 ...

随机推荐

  1. Linux修复日志

    阿里云后台系统报告漏洞,解决记录 中级: RHSA-2019:0049-重要: systemd 安全更新

  2. Appium学习2-Appium-desktop的使用

    安装: 下载路径:https://github.com/appium/appium-desktop/releases 选择最新的安装包即可. 使用 1.点击打开应用程序,进入到配置项. 2.配置以下信 ...

  3. 机器学习作业(一)线性回归——Matlab实现

    题目太长啦!文档下载[传送门] 第1题 简述:设计一个5*5的单位矩阵. function A = warmUpExercise() A = []; A = eye(5); end 运行结果: 第2题 ...

  4. Wannafly Camp 2020 Day 6M 自闭 - 模拟

    按题意模拟,又乱又烦,没什么可说的 #include <bits/stdc++.h> using namespace std; #define int long long int n,m, ...

  5. 2个月,我从编程小白成为了Python研发工程师

    从编程小白,到Python研发工程师,需要多久呢? 答案就是:91门课,450个小时. 听起来似乎难以实现,但其实如果每天抽出八小时学习,两个月的时间,就能由编程小白转变成为Python工程师,听起来 ...

  6. javaScript入门(函数)

    目录 JavaScript函数 函数是什么 函数返回值 return特点: 递归函数 匿名函数(anoymous) 自执行函数(通过匿名函数实现) 回调函数 闭包函数 构造函数 构造函数两大类 注意事 ...

  7. Java流,文件和I/O

    java.io包中包含几乎所有可能永远需要在Java中执行输入和输出(I/ O)类.所有这些数据流代表一个输入源和输出目标. java.io包中的流支持多种数据,如基本类型,对象,本地化的字符等 流可 ...

  8. 清理 /dev/vda1 系统磁盘

    df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100% 思路是: 1.cd /usr 2.du -sh * 看哪个目录占用空间大 3.重复前两步,根据实际情况删除或者移走 4.日志的话可以运行 ...

  9. Web渗透测试思路整理

    信息收集: 域名/IP 子域名列表 whois: 注册地址,注册人,联系方式等 whois反查: 同ip有哪些站点(旁注),同一个注册人注册了哪些域名 社工注册人信息 指纹识别: 操作系统及版本 数据 ...

  10. 网络流EK算法模板

    \(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, ...