Java基础 之二 类和对象
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基础 之二 类和对象的更多相关文章
- Java基础_0302:类和对象
定义类 class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 /** * 输出对象完整信息 */ public voi ...
- java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列
1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...
- java 基础知识九 类与对象
java 基础知识九 类与对象 1.OO(Object–Oriented )面向对象,OO方法(Object-Oriented Method,面向对象方法,面向对象的方法)是一种把面向对象的思想应 ...
- JAVA基础(二)—— 常用的类与方法
JAVA基础(二)-- 常用的类与方法 1 Math类 abs ceil floor 绝对值 大于等于该浮点数的最小整数 小于等于该浮点数的最大整数 max min round 两参数中较大的 两参数 ...
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- Java实习生常规技术面试题每日十题Java基础(二)
目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- java基础(二章)
java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l 必须以字母.下划线 _ .美元符号 $ 开头 l 变量中,可以包括数字 l 变量中,不能出现特 ...
随机推荐
- Chrome浏览器调试移动端网页,测试人员也可以轻松debug
现在的产品,移动端应用占据很大市场,在测试过程中,就会测试各种各样的移动端页面.测试过程,或多或少会发现些问题,无非就是前端.后端问题.后端接口问题,可以利用工具:Fiddler或charles抓包查 ...
- 编程福利:50本C语言电子书,你还怕没书看吗!
推荐适合编程新手入门的几本经典的C语言书籍. 1.<C程序设计语言> C语言之父的著作,被称为C语言的的圣经.全球最经典的C语言教程.这本书最大的特点是精炼.读起来不会觉得"啰嗦 ...
- v-model数据绑定分析
v-model数据绑定分析 v-model是Vue提供的指令,其主要作用是可以实现在表单<input>.<textarea>及<select>等元素以及组件上创建双 ...
- 19。删除链表倒数第N个节点
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next# 这道题还是很简单的,我们只 ...
- selenium 图片懒加载
from selenium import webdriver options = webdriver.ChromeOptions() prefs = {} prefs['profile.managed ...
- selenium基础 --获取内容
from time import sleep from selenium import webdriver browser = webdriver.Chrome() url = "http: ...
- 关于Dockerfile
在Docker中创建镜像最常用的方式,就是使用Dockerfile.Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A.B.C.D-的步骤.Dockerfile其内部包含 ...
- nginx 是如何处理过期事件的?
目录 什么是过期事件 nginx 是如何处理过期事件的? 参考资料 什么是过期事件 对于不需要加入到 post 队列 延后处理的事件,nginx 的事件都是通过 ngx_epoll_process_e ...
- airtest操作夜神模拟器adb冲突解决办法
首先看错误日志明显是adb之间版本不对应互相干掉对方 第一步 去aritestIde所在目录\AirtestIDE\airtest\core\android\static\adb\windows 第二 ...
- 分布式雪花算法获取id
实现全局唯一ID 一.采用主键自增 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据 ...