Classes and Objects :类和对象

Classes and Objects :类和对象,第1张

Classes and Objects :类和对象(1)

类的定义:修饰符,class,类名,extends,逗号分隔的implements,类体{}

规范的类名:首字母要大写,以后每个单词首字母都大写

字段的定义:修饰符,类型,字段名

按照封装的思想,字段通常定义为private,然后提供public方法来访问和修改他们

方法的定义:修饰符,返回类型,方法名,(参数列表,逗号分隔,或为空),异常声明throws,方法体{}

方法的signature(签名)包括方法名称,参数数量,类型,顺序

所以只是返回类型不同的两个方法是通不过编译的

规范的方法名:首单词为动词,首字母小写,以后每个单词为动词或形容词或名词,首字母大写

构造方法用于生成对象时做一些默认的处理,但名字是类名,而且没有返回类型

构造可以有多个,注意方法的签名是区分方法的唯一途径

可以不写,编译器自动提供默认构造,没有参数,并会调用父类的无参构造

也可以手动编写,调用自己的其他构造或父类其他构造

不调用构造是不可能生成对象的,如果最上面的父类也没有构造,编译会报错,当然Object是有的

Parameters通常指方法声明的形参,Arguments通常指实际传入方法的实参

Java不允许把方法名作为参数传入另一个方法,但可以使用lambda表达式

可以指定一个未知数量的参数列表,但要是同一类型,会接受0到n个,而且只能是参数列表的最后几个参数

public PrintStream printf(String format, Object... args)

会用数组方式传入,实际也可以直接传入一个数组

方法声明的参数名可以跟类的字段重名,会覆盖掉

在块中的局部变量也是这样,比如循环体中

要访问那个字段要用全名,this.XX

方法的参数如果传递的是原始类型,则始终是按值传递的

形参的修改不会影响实参,方法返回时所有形参值不被保留

如果传递的是对象类型,其实也是按值传递的,但传递的是一个引用,一个地址

对这个地址上的对象进行 *** 作会引起实际对象的更改

public void moveCircle(Circle circle, int deltaX, int deltaY) {
// 会更改传入对象,因为基于这个地址 *** 作
circle.setX(circle.getX() + deltaX);
circle.setY(circle.getY() + deltaY); // 不会更改,只是改变了一个地址
circle = new Circle(0, 0);
}

生成对象:一般说对象的生成就是指对象的实例化

new的作用:为这个对象分配内存空间,返回这个对象的地址,当然也要调用类的构造从而初始化这个对象

new后面需要跟一个参数,指明哪个类,以及调用哪个构造

Rectangle rectTwo = new Rectangle(50, 100);

并不一定要赋给一个变量,可以new完直接使用的

int height = new Rectangle().height;

在类中直接访问实例变量是报错的,因为他们只存在于某个对象中

JRE检测到某个对象不会再被调用时,会删除这个对象,释放所占的内存资源,这个过程就叫garbage collection

变量在作用域外面时会丢失,将成为垃圾搜集的目标

也可以手动置这个变量为null

garbage collector(垃圾搜集器)来自动完成这个工作

方法返回的方式:

执行完了所有语句,自动返回

遇到return

抛出了异常

 

方法的返回类型可以是某个类或者接口,这时候返回的那个必须是他的对象或者子类对象或者接口的实现类

这称为covariant return type

 

在方法或构造方法中,可以使用this,代表当前对象,也就是这个方法到底是哪个对象调用的

不能在静态方法中使用,因为静态方法不需要任何对象就可调用

可以在某个构造中用this(..)调用其他构造,但要在首行

 

类只有两种修饰符,public和默认,类成员的修饰符则可以有四种

protected表明除了本包可访问,别的包的子类也可访问

通常来说不要让所有的都是public的,除了某些常量

除了某个确定的目的,尽量缩小变量的访问权限(封装思想)

 

访问类变量推荐用类名+变量名,用对象名也行,但可读性较差

 

方法也可以是static的,无需实例化就可调用

方法也可以使final的,表示不能被子类覆盖

在对象实例化,初始化时只能调用final方法,否则编译报错

 

 常量在运行时是无法更改的,更改会编译报错

static final double PI = 3.141592653589793;

 

如果是原始类型或String,编译器会在编译时把每个出现的地方都用这个值替代,compile-time constant.(编译时常量)

如果更改,只能重新编译一次

如果这个常量是个对象,那只是这个地址不可修改,对象是可以任意修改的,这样通常没有意义

 

static初始化块,会在类的实例化时只运行一次,通常用来初始化字段

可以位于类体中任何位置,也可以有多个,会按顺序执行

 

如果多个构造都要进行同样的实例变量初始化,可以放到 非static初始化块 里

编译器会在每个构造里都拷贝一份

 也可以写一个final方法用来初始化,然后在各个构造里调用,这个方法不会被覆盖,是可信赖的

 

可以用assert(true);来做一个检测,运行要用java -ea Test

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/585989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存