1.基础概念

1) 概念

简单来说,类是具有相同特征事物的抽象,比如有轮子的都可以抽象为车;对象则可以看做类的具体实例,比如创建一个法拉利的车,就是车这个类的实例。

抽象、封装、继承、多态是类的四个特点

2) 类之间的关系

  • 依赖
依赖就是一种"uses a"关系。
比如订单类需要用到账户类的一些属性。
所以说,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
一般而言,依赖关系在Java中体现为局域变量、方法的形参,或者对静态方法的调用。
  • 关联
被关联类B以类属性的形式出现在关联类A中,或者关联类A引用了一个类型为被关联类B的全局变量的这种关系,就叫关联关系。
比如在Java中,关联关系一般使用成员变量来实现。
  • 聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系
public class Family {
private List<Child> children; //一个家庭里有许多孩子 // ...
}
在关联关系中,类AB之间没用必然的联系,比如员工类中有属性自行车,但是聚合关系中是拥有的关系,比如家庭里有孩子,但是这种关系也不是必然拥有的。
聚合关系意味着A类对象包含着B类对象
  • 继承
继承是一种"is-a"的关系,表示特殊与一般的关系。
比如说水果类是父类,柚子类是子类,它是水果类的一种扩展,拥有额外的属性和方法。

3) 构造器

//构造器就是与类同名的函数,作用就是初始化类的对象的属性。
public class Employee{
private String name;
private Double salary;
private LocalDate hireDay;
}
//没有void
public Employee(String n,double s,int year,int month,int day)
{
name = n;
salary = s;
LoacalDate hireDay = LocalDAte.of(year,month,day);
}
Employee employee = new Employee("James",20000,1890,1,1);

需要注意的是

1.构造器与类同名
2.每个类可以有多个构造器,构造器可以有0个或1个或多个参数
3.构造器没有返回值
4.构造器总是和new一起用

4) this

//看这个方法
public void raiseSalary(double byPercent){
double raise = salary * byPercent/100;
salary = raise
}
//调用
james.raiseSalary(50);
/*
raiseSalary这个方法有两个参数
1.byPercent是显式参数
2.this,是隐式参数,代表调用此方法的那个对象
*/
//相当于
public void raiseSalary(double byPercent){
double raise = this.salary * byPercent/100;
this.salary = raise
}

5) 封装的优点

类中的属性都是private域,这样封装可以防止外界轻易修改这些属性
若想修改属性,就可以像4中那样在类中写一个修改的方法。 若一个类中包含下面三项
1.私有的数据域
2.公有的域访问器方法 getter
3.公有的域更改器方法 setter
这个类可以叫做bean

6) 基于类的访问权限

一个方法可以访问所属类的所有对象的私有数据!

2.静态域和静态方法

1) 静态域

class Employee{
private static int companyId ;
}
/*
Employee类的所有对象共享companyId域,
静态域属于类,而不属于任何独立的对象 */

2) 静态常量

//静态变量使用的比较少
//静态常量使用的多
public class Math{
...
public static final double PI = 3.1415926535897;
...
} //System.out out也是System类中的静态常量
public static final PrintStream out = ...; //final 修饰的域不能被修改

3) 静态方法

/*
静态方法是没有this的方法,因为它不能访问非静态实例域,因为它不能操作对象,它在对象被创造前已经初始化
静态方法可以访问自身类中的静态域
*/
class Employee{
private static int companyId ;
public static int getcompanyId(){
return companyId;
}
}
//直接用类名调用
int n = Employee.getcompanyId();

4) main

main方法也是静态方法,它不对任何对象进行操作
事实上,在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象。

3.方法参数(值传递)

/*
先说重点:Java语言是值传递,方法形参得到的是所有实参的拷贝
众所周知,方法的参数有两种类型
1.基本数据类型
2.引用类型
*/ //举例1 基本数据类型
public static void tripleValue(double x){
x = 3*x;
System.out.println(x); //输出30
}
double value = 10;
tripleValue(value);
System.out.println(value); //输出10
/*
实际上是把value的值复制了一份给x,而全程在方法中操作x,和value无关
*/
//举例2 引用类型
public static void function(Employee x){
x.raiseSalary(20000); //Employee中的方法
}
harry = new Employee(...);
function(harry);
//此时harry的工资涨了20000 /*
你可能会疑问 不是值传递吗,怎么还会改变原来的对象值?
实际上,这里还是值传递,只不过引用类型传递的是引用对象的地址值的拷贝
所以harry把它所指向对象的地址拷贝给x
然后harry和x就指向同一个对象,自然就修改了该对象
这里的值传递是引用的对象地址值的拷贝
*/

4.重载 重写

先介绍一下重载和重写
1.方法重载:
在同一个类中保持方法名相同,参数的类型或数量不同,返回值可以相同也可以不同。
拓展:方法签名是由方法名和参数列表构成,也就是说返回值以及访问修饰符不算方法签名,方法签名可以唯一确定类中的一个函数。
所以重载就是方法名相同,参数列表不同的函数,和返回值以及访问修饰符无关。 2.方法重写:
子类重写父类的某一函数,保证函数名、参数都一样,返回值的类型要小于父类方法的返回值类型;
抛出异常类型的范围要小于父类抛出异常的类型;
子类函数访问权限大于父类。
父类private的方法不能被继承,也就不存在重写。

5.对象构造

1) 默认初始化

//若构造器中没有显式的赋初值,那么域就会被赋为默认值:数值为0、布尔值为false、对象引用为null
Employee e = new Employee();

2) 无参构造器

//示例
public Employee(){
name = "";
salary = 0;
hireDay = LocalDate.now();
}
说明:
1.若编写类中无构造器,系统会提供一个默认的无参构造器,所有的值设置为默认值;
2.若类中提供了至少一个构造器,但是没有无参构造器,则在构造对象的时候不提供参数被视为不合法;

3) 有参构造器的参数名

public Employee(String aName,double aSalary){
name = aName;
salary = aSalary;
} public Employee(String name,double salary){
name = name;
salary = salary;
}
/*
1.为了保证可读性,一眼就看懂参数,可以在变量名前加一个a
2.或者将参数名和数据域同名,用this表示是对象的域 */

4) 调用另一个构造器

public Employee(double aSalary){
this("Jack",aSalary) //调用3中的两个参数的构造器
}

5) 初始化块

三种初始化数据域的方法
1.利用有参构造器
2.直接在声明时赋值
3.初始化块
//只要构造类的对象,这些块就会被指向
//构造对象时,先执行块,再执行构造器
class Employee{
private static int nextId; //从0开始
private int id; //员工id
{
id = nextId;
nextId++;
}
}
//也可以用静态块初始化静态域
static{
Random generator = new Random();
nextId = generator.nextInt(10000);//赋予一个小于10000的随机值
}

6) finalize

可以为任何一个类添加finalize方法
finalize将再垃圾回收器清楚对象之前调用
但是实际上,很难知道finalize方法什么时候才能调用,用的不好还会影响GC性能,少用

6.包

Sun公司建议将公司的因特网域名的倒序作为包名,对于不同的项目用不同的子包
com.tyy.demo1
con.tyy.demo2

1)类的导入

//一个类可以使用所属包中的所有类,以及其他包中的公有类
//两2种方式访问另一个包的公有类
//方式1
java.time.LocalDate today = java.time.LocalDate.now(); //方式2
import java.util.*;
LocalDate today = LocalDate.now();
//需要注意
//只能使用*导入一个包,而不能用import java.*或者import java.*.*导入以java为前缀的所有包

2) 静态导入

//import还可以导入静态方法和静态域
import static java.lang.System.*;
//就可以使用System类的静态方法和静态域
out.println("GoodBye world"); //省略了System.

3) 将类放入包中

pakage com.tyy.demo
public class Employee{
.....
}
//如果没有在源文件中写pakage语句,这个源文件的类就被放在一个默认包中,默认包是一个没有名字的包

4) 包作用域

如果没有指定public或private,这个部分(类、方法或变量)可以被同一个包中所有方法访问

5) 类路径

jar包包含了多个.class文件
类路径是所有包含类文件路径的集合 就是.class文件
在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候。
classpath就是存放.class等编译后文件的路径。 javac:如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面加上-classpath参数,通过使用以下三种类型的方法 来指导编译器在编译的时候去指定的路径下查找引用类。 (1).绝对路径:javac -classpath c:/junit3.8.1/junit.jar Xxx.java
(2).相对路径:javac -classpath ../junit3.8.1/Junit.jar Xxx.java
(3).系统变量:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%表示使用系统变量CLASSPATH的值进行查找,这里假设Junit.jar的路径就包含在CLASSPATH系统变量中)

7.文档注释

文档注释是/** ... */

1) 类注释

类注释必须放在import之后,类定义之前

2) 方法注释

@param 变量描述
@return 返回值描述
@throws 抛出异常描述

3) 域注释

/**
the "Hearts" card suit
*/
public static final int Hearts;

4) 通用注释

@author 姓名 可以使用多个
@version 版本
@since 堆引入特性的版本描述
@deprecated 这个标记对类、方法、变量、添加一个不再使用的注释
@see 引用

8.访问权限

public 			所有的类都可以访问
protected 本包、所有子类可以访问
default 本包可以访问
private 只有本类可以访问

Java基础 之二 类和对象的更多相关文章

  1. Java基础_0302:类和对象

    定义类 class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 /** * 输出对象完整信息 */ public voi ...

  2. java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列

    1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...

  3. java 基础知识九 类与对象

    java  基础知识九  类与对象 1.OO(Object–Oriented )面向对象,OO方法(Object-Oriented Method,面向对象方法,面向对象的方法)是一种把面向对象的思想应 ...

  4. JAVA基础(二)—— 常用的类与方法

    JAVA基础(二)-- 常用的类与方法 1 Math类 abs ceil floor 绝对值 大于等于该浮点数的最小整数 小于等于该浮点数的最大整数 max min round 两参数中较大的 两参数 ...

  5. Java基础十二--多态是成员的特点

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  6. Java基础-DButils工具类(QueryRunner)详解

    Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...

  7. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  8. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  9. java基础(二章)

    java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l  必须以字母.下划线 _ .美元符号 $ 开头 l  变量中,可以包括数字 l  变量中,不能出现特 ...

随机推荐

  1. localStorage使用小结

    一.什么是localStorage.sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题 ...

  2. swoft生成控制器

    [root@localhost swoft]# swoftcli gen:controller -h [ERROR] Command 'controller' is not exist in grou ...

  3. 使用composer 显示错误美化

    新建comoser.json { "name": "brady_frmwork", "description":"php fram ...

  4. <bdi> 标签

    bdi 指的是 bidi 隔离. <bdi> 标签允许您设置一段文本,使其脱离其父元素的文本方向设置. 在发布用户评论或其他您无法完全控制的内容时,该标签很有用. 实例 把用户名从周围的文 ...

  5. 没花一分钱的我竟然收到的JetBrains IDEA官方免费赠送一年的Licence

    前言 做java的人,一般IDE工具用的不是eclipse就是IntelliJ IDEA了吧,eclipse因为是开源软件,而且起步比较早,功能也比较完善.早期基本上做java的使用eclipse都是 ...

  6. naicat如何查看表关系

    1.navict版本为:navict premium https://www.php.cn/tool/navicat/427617.html 参考上面链接 2. 这个版本的 目前就这些,后续进行补充

  7. python图片验证码识别最新模块muggle_ocr

    一.官方文档 https://pypi.org/project/muggle-ocr/ 二模块安装 pip install muggle-ocr # 因模块过新,阿里/清华等第三方源可能尚未更新镜像, ...

  8. Linux的top命令及交换分区

    TOP命令关键指标 %MEM,在内存中的占用率 %CPU,使用率,如果两核,最大可到200% TIME+, 占用cpu的总时间/s SHR,分享内存 RES, 常驻内存,进程当前使用的内存大小,不包括 ...

  9. 论文解读《Learning Deep CNN Denoiser Prior for Image Restoration》

    CVPR2017的一篇论文 Learning Deep CNN Denoiser Prior for Image Restoration: 一般的,image restoration(IR)任务旨在从 ...

  10. java 文件和byte 互转

    /** * 获得指定文件的byte数组 */ private byte[] getBytes(String filePath){ byte[] buffer = null; try { File fi ...