JAVA中的类和对象

面向对象的精髓:

一、类

1.几个概念:类、构造器、对象、对象变量。

类的构造器初始化一个对象,对象变量引用这个对象。所有对象都是在堆中构造的。

eg:Date deadline=new Date():这其中Date()为Date类的构造器,new Date()出一个对象,而对象变量deadline引用这个对象。(类似与C++的指针,指向被引用的对象)

2.一个源文件中只能有一个公有类(public)

3.几个名词:1).实例域:类中的参数,建议用private。构造器就是初始化类的实例域。

2).构造器:与类同名!没有返回值、总是伴随new使用、一个类可以有多个构造器

3)访问器:类提供给外部用来《只读》类实例域的方法接口,注意访问器一定不能返回引用可变对象,如果一定要返回引用可变对象,则返回它的克隆副本-return object.clone()。

4.final实例域,不可修改的变量

class a{ private final string s}

但是!对于一个可变的类用final修饰:例如:pirvate final StringBuilder builder;builder=new StringBuilder()   这里的final表示存储在对象变量builder中的对象引用不会再指向其他StringBuilder。

5.静态域和静态方法

1)静态实例域--类域:class A{private static in douyou=1}

这样在这个类每一个对象的实例域中都有douyou这个域。修改这个域直接对类进行操作A.douyou=*

2)静态常量:例如math类 public class Math{ public static final double PI=3.1315926...;PI这个静态常量就可以直接通过Math.PI获得,而不需要通过Math.getPI()获得。

另一个例子system类:public class System{ public static final PrintStream out=...;} 故才有了System.out.print(),并且由于out被声明为final,不允许将其他打印流赋给他。

3)静态方法:不能向对象实施操作的方法。例如math.pow(a,x),即静态方法不能访问类中的实例域,但是可以访问静态域(类域)。更新!:今天进一步理解了静态方法:

静态方法和实例化方法最根本的区别在于,静态方法是在程序开始时就已经分配好内存(所以比较占资源),而实例化方法是在程序运行时才分配好内存,也就是说,静态方法不需要实例化对象(new)就可以实用---math.pow(),

4)静态方法用于实现静态工厂(待续

5)静态方法用于main()方法

6.方法参数

java是按值传递的,也就是说java的方法得到的是参数值的拷贝,也就是说java的方法不能改变传递给他的参数变量的内容。

那么问题来了,我们该如何通过方法来改变一个变量呢?这里先来介绍方法参数的类型:1.基本数据类型(数字、布尔)2.对象引用

因此,如果我们让方法得到对象的引用就可以改变对象引用的对象的内容!

但是要注意了,方法不能让对象引用去引用一个新的对象。

解释:方法得到对象引用a后,拷贝一个新的和a引用的对象一样的引用b,通过对b的操作,实现对对象的改变。

但是改变b的引用对象并不能引起a的引用对象的改变。例如swap(object a,object b)是徒劳的。

7.构造器的编写:

重载:通过签名(方法参数个数、参数类型)的不一样,构造器也不一样,编译时通过重载解析选择匹配的构造器。

ps:一个类中,一个构造器可以通过关键字this调用另一个构造器eg:class A{public A(Int,string){}  public A(int){this(int,"asd")}第二个调用了第一个。

二、继承

8.超类、子类

通过extends,实现子类继承超类。子类继承父类的共有域和方法(super调用)

子类可以继承或者覆盖父类的方法。调用父类方法时加super:super.Superclass's function

子类构造器:通过重载父类的构造器

public subclass(int string){

super(int string)  } //父类的

注意到super和this的功能很类似:1.this用于隐式参数 super调用超类方法

2.this调用该类的其他构造器,super调用超类的构造器。注意这种用法super/this行必须是第一行

9.多态:多态体现在方方面面

1)置换法则:凡是超类均可以用子类代替(可以理解为:超类能干的子类都能干,因为都继承了。而子类能干的超类不一定能干,因为子类可能会实现一些超类没有的方法或者域} eg:Superclass A;A=new subclass()

2)动态绑定:在【运行】时能自动选择具体调用哪个方法。

eg:父类有一个speak()方法,子类重写覆盖了这个speak()方法,定义一个父类数组,由于置换法则,父类数组中既可以有父类也可以有子类,当用foreach循环遍历调用speak()方法时,程序可以自动正确的选择父类方法还是子类方法

PS:编译器方法调用流程:调用方法x.f(args),编译器会事先获得X及其父类所有的名为f的方法(父类中的公有f方法),然后编译器会根据每个候选f方法的参数类型找到与x.f(args)提供的参数类型完全一致的方法----这就是重载解析,如果没有找到或者找到多个就会报错。但是每次都搜索时间开销太大,所以JVM提供了一个方法表,上面有所有方法的签名和实际使用的方法。

3)如果是由private、static、final修饰的方法,则是静态绑定,即编译时编译器就已经知道具体调用哪一个方法。

<1>final---作用与类则说明这个类禁止继承、作用于方法则说明这个方法禁止子类重写覆盖,另外值得注意的final类中方法均为final方法而域不是final类域

10.抽象类:一般来说越上层的类或方法,越通用,越抽象

eg:person->employee->manager,name\age这种通用属性就可以定义在person中

1)包含抽象方法的类必须被声明为抽象类

2)抽象方法充当着占位的角色,具体实现在子类中。只有已经占位的方法,才能通过超类动态绑定的形式调用。---接口就是抽象类。

3)抽象类不能被实例化:person p=new person()---错误!

但是可以定义一个抽象类的对象变量去引用非抽象子类:person p=new employee()

11.受保护的访问protected:对本包和所有子类可见

12.Object类---所有类的超类:除了基本类型(int char boolean...),其他所有类都是扩展Object类而来:下面介绍几种重要的Object类方法:

1)equals:判断对象之间的相等

在子类中重写覆盖object类的equals方法:具体见corejava1:p166-170

2)hashcode:还没看!待续

3)tostring方法:返回一个对象的描述:类名字+域值。

值得注意的java编译将tostring优化:可以用 +x 替代x.tostring()

12.对象包装器:将基本类型包装为对象。

int->Integer、double->Double

用途:例如泛型数组或者其他菱形语法中不能使用基本类型,就需要通过wrapper转换:ArrayList<Integer> a=new ArrayList<>()

自动装箱(拆箱):int和Integer相互转换是自动的

eg:int n=a.get(i)---自动Ia.get(i).intValue()、list.add(3)---自动list.add(Integer.valueOf(3))、Integer n=3;n++;---完全正确

另外一个重要应用:可以将数字字符串类型转换为数字:Int=Integer.parseInt(String)

13.定义可以接受多个参数的方法:...语句。

例如system.out.printf(String fmt,Object...args)---可以接受多个Object对象(一个Object数组)

14.java中的枚举实际上是一个类,而每一个枚举值都是枚举类的一个实例。

eg:enum Week {MONDAY,TUESDAY,FRIDAY}每个都是一个枚举对象实例。

可以在枚举类中定义构造器和方法甚至实例域:

{

private String abbrevation;

private Week(String s){this.abbrevation=s;}//构造器

public String getabb(){return (this.)abbrevation;}

15.反射(还没看,待补充)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值