Core Java 第四章总结

封装:实例域,方法
防止类中方法访问到其他类的实例域,仅通过方法进行交互。
继承:拓展一个类的方法和实例域。所有类继承自超类Object
 
对象变量仅仅引用对象,不实际拥有对象。变量可显示定义为null
 
自定义类
class ClassName{
field1
field2
...
constructor1
constructor2
...
method1
method2
...
}
 
构造器:与类同名,只能随着new被调用。构造器不要定义和实例域相同的变量
 
private方法:只有自己的方法可以调用
private域:只有同类的方法可以修改访问
 
this关键字表示隐式参数,即对象本身。
 
方法返回值不能是类自身的可变对象引用,否则会破坏封装,要返回则需要返回该对象的clone值引用。
 
final关键字:定义后必须初始化,通常用于不可变常量和不会被更改的类对象。对象若可变,final修饰的变量只是引用关系不会变,对象本身可以变。
static关键字:
静态域:每个类所有对象共享。
静态常量:public static final 定义后不再变直接用。
静态方法:不能向对象使用,没有this参数,直接用类名调用,该方法可以访问静态域。
使用场景:(1)不需要对象状态,操作通过显示输入的参数完成。
(2)该方法只需要访问静态域
 
工厂方法*:重要考察点,书上一笔带过
用工厂方法代替new实例化新对象,给你系统带来更大的可扩展性和尽量少的修改量。
之后细看
 
main方法
 
方法参数:
JAVA总是按值调用,即方法得到所有参数的拷贝,而不是引用。但是传入方法为同一个对象的引用时,复制的只有引用,方法内部对对象的操作会影响到引用的对象,但改变引用的做法不会改变对象。
 
 
String q="fuck";
String p="hahaha";
swap(q,p);
System.out.println(q);
 
public static void swap(String a,String b ){
    a="??";//1
    //a.toUpperCase(); //2
}
这里输出还是“fuck",因为在函数内部是把拷贝引用a的引用对象指向了一个新对象。
2号代码也不行,依然输出“fuck”,因为a.toUpperCase();这句:按照JAVA的字符串规则,是生成一个新串,而不是在原串上改动。所以a这个拷贝的引用位置又变了。如果用stringbuffer, 不改变引用的情况,内部的append方法会影响到外面的对象,因为两个拷贝作用在一个对象上。
所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。
 
 
4.6对象构造
重载:同名不同参数的方法。和返回值无关
jvm调用方法前根据方法名+参数列表(参数类型+参数名) 唯一确定要调用的方法。
返回值不用考虑,返回值是调用方法后的结果。 编译不通过,更谈不上被重载了。
不会有不同返回值,其他都相同的方法。
 
默认初始化:
构造器不显式初始化的,数值赋0,对象引用为null
不编写构造器,系统自动提供无参数构造器。
提供了有参数构造器而不提供无参数构造器的,系统视为非法。
 
显式初始化:
类定义时候直接初始化。预赋值在构造器之前执行,所以构造器可以覆盖预赋值。
 
重载构造器中可以用this(...)调用另一个构造器,这样方便使用构造器的公共部分。
初始化块机制,放在构造器之前,构造时被调用。
如果对静态量的初始化比较复杂,可以编写静态初始化块,在块前加关键字static,只在首次实例化时执行一次。
JAVA没有析构器,但内存回收上有一些选项。
 
4.7包
编译器看来,嵌套的包之间没关系。
一个类可以使用包之中的所有类,以及其他包的公有类。
两个包有同名类,并且被调用时,编译器会出错。这种情况,在import 。。. 。。.*句子下面加一条完整类名,覆盖上面的冲突。如果两个都要用,在程序里用完整的包名。
还可以import静态方法和静态域: import static java.lang.System.*(或者out);之后可以使用out.println("");
 
将类放入包中:package com.horstman.corejava
不添加放置语句的类放入default 包中,被放入包的类有相同目录结构。如com/horstman/corejava下
编译器编译时不检查包结构,运行时找不到包会出错
 
jar相关:第十章
 
4.8类路径 4.9 文档注释略
4.10 类设计技巧
一定保证数据私有(封装),一定要初始化,避免过多基本类型的使用。有的域不需要访问器修改器。
职责过多的类进行分解。
类名习惯:Order、RushOrder、BillingAdress。。。
方法名习惯:getSalary,setSalary。。。
posted @ 2019-09-20 11:27  CaptainL  阅读(154)  评论(0编辑  收藏  举报