关于this关键字
this一般出现在类的方法的定义(声明)中。
this指向自身对象的引用,当必须指出当前使用方法的对象是谁时要使用this
有时使用this可以处理:方法中,成员变量和参数重名的情况。
this可以看作是一个变量,它的值是当前对象的引用。
当一个方法还没调用时,this指谁并不知道,当new一个对象时,this指的就是当前这个对象
static关键字:
在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量。
在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份,而且是这个类所有对象公用的。
用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
静态方法不再是针对某个对象调用,所以不能访问非静态成员。
访问:可以通过对象引用 或 类名(不需要实例化)访问静态成员。任何一个对象都可以访问静态的值,访问的都是同一块。
eg. 类名.xxx (xxx是静态的变量)对象名.xxx
如果没有写static,必须new一个对象才能调用方法,因为static会使整个方法不再专属于某个对象,而是整个类,所以可以直接调用
针对不同的对象调用方法,它的作用域是不同的。
类的继承:
extends关键字:
通过继承,子类自动拥有父类的所有成员(成员变量和方法)。
Java只支持单继承
访问控制:
Java权限修饰符public protected private置于类的成员定义前,用来限制其他对象对该类对象成员的访问权限。
修饰符 |
类内部 |
同一个包 |
子类 |
任何地方 |
private |
Yes |
|||
default |
Yes |
Yes |
||
protected |
Yes |
Yes |
Yes |
|
public |
Yes |
Yes |
Yes |
Yes |
对于class的权限修饰只可以用public和default
public类可以在任意地方被访问
default只可以被同一个包内部的类访问
super关键字
super来引用基类(父类)的成分
一个子类对象new出来时,在子类对象内是有一个父类对象的。
继承中的构造方法
子类的构造的过程中必须调用其父类的构造方法
如果子类构造方法中没有显示地调用父类的构造方法,则系统默认调用父类的无参构造方法,如果父类中没有无参的构造方法,则编译出错。
子类可以在自己的构造方法中用super(argument_list)调用父类的构造方法。
◇ this(argument_list)调用另外的构造方法
◇ 如果使用super,必须写在子类构造方法的第一行
Object类:
Object类是所有java类的根基类
如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object,
public class Person{……} 等价于 public class Person extends Object{……}
toString方法:
Object类中定义有public String toString( )方法,返回值是String类型,描述当前对象的有关信息
在进行String与其他类型数据的连接操作时(如:System.out.println(“info”+person)将自动调用该对象的toString方法)
可以根据需要在用户自定义类型中重写toString()方法
hashcodes table
hashcodes table来记录每个对象在什么位置,这张表由哈希编码来记录,每个对象有自己独一无二的哈希编码,根据编码找到相关对象位置。
equals方法
Object类中定义有:public boolean equals ( Object obj ) 方法,提供定义对象是否相等的逻辑。
Object的equals方法定义为:x.equals(y)当x和y是同一对象的引用时返回true否则返回false
J2SDK提供的一些类,如String,Date等,重写了Object的equals方法,调用这些类的equals(y)方法,x.equals(y),当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回true否则返回false
可以根据用户在自定义类型中重写equals方法
对象转型(casting) “可扩展性“
一个基类的引用类型变量可以“指向”其子类的对象,但是它不可以访问其子类对象新增加的成员(属性和方法)
可以通过强制转换来解决:eg:Dog d1 = (Dog)a;(a是基类的对象)
可以使用 引用变量instanceof 类名 来判断该引用型变量所指向的对象是否属于该类或该类的子类eg. if(a instanceof Cat)
子类对象可以当作基类对象来使用称作向上转型(upcasting),繁殖称为向下转(downcasting)
总结:父类引用可以指向子类对象,可以带来比较不错的可扩展性:可以在方法里定义父类引用,在实际传的时候是传子类的对象。
可扩展性比单独定义好几个方法好一些,但是没有达到最好。
动态绑定和多态
在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际调用其相应的方法。
补充:只有在运行期间(new谁就调用谁的方法),更深点:本来指向的方法随new的对象改变,只有在new出来以后运行期间,才知道这个方法调用的是哪个。
带来了最好的可扩展性,面向对象核心中的核心
多态的三个条件
1要有继承
2要有重写
3父类引用指向子类对象
当你调用父类中被重写的方法时,实际当中调用的哪个子类对象时,就调用哪个子类对象的方法。
抽象类
抽象类:abstract修饰的类
抽象方法:abstract修饰的方法,只有定义没有实现
含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
抽象类不能被实例化、抽象方法只需声明,不需实现
任何含有一个或多个抽象方法的类都必须声明成抽象类。
声明一个抽象类,只需在类声明开始时在关键字class前使用关键字abstract。抽象类没有对象。也就是说,一个抽象类不能通过new操作符直接实例化。这样的对象是无用的,因为抽象类是不完全定义的。而且,你不能定义抽象构造函数或抽象静态方法。
所有抽象类的子类都必须执行超类中的所有抽象方法或者是它自己也声明成abstract。
final (只读)
final变量值不能被改变: final的成员变量、final的局部变量(形参)
final的方法不能够被重写
final的类不能够被继承eg.String Math Boolean
interface
多个无关的类可以实现同一个接口
一个类可以实现多个无关的接口
与继承关系类似,接口与实现类之间存在多态性(new谁就调用谁的方法)
接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义。而没有变量和方法的实现
接口是抽象方法和常量值的定义的集合
成员变量:(public static final)默认 int id = 1;
为修正c++多继承容易出现问题的地方,多个父类如果有相同的成员的问题!
把接口的所以成员变量都改成public static final,避免了这些问题,static不属于专门的对象。
接口中所有的方法都是abstract,默认的不需要写
接口中声明的属性默认是public static final的,也只能是这样的。
接口可以多重实现;(多个接口-多继承)
一个接口中的方法只能是抽象方法,默认是抽象方法
接口可以继承其他接口,并添加新的属性和抽象方法
接口在本质意义上是抽象类