1. 继承
- 子类继承了父类,就继承了父类的方法和属性。
- 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
- 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。
- 类继承语法规则:
class Subclass extends SuperClass{ }
- 子类不能直接访问父类中私有的(private)的成员变量和方法。
- Java只支持单继承和多层继承,不允许多重继承即:父类只能有一个,但可以存在爷爷类
2. 重写
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、 参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
- 子类不能重写父类中声明为private权限的方法
- 子类方法抛出的异常不能大于父类被重写方法的异常
3. 修饰符
修饰符 | 当前类 | 当前包 | 不同包的子类 | 工程内 |
---|
private | yes | | | |
default | yes | yes | | |
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
public class Parent {
private int b;
int a;
protected int c;
public int d;
private void f2() {
System.out.println("f2" + b);
}
void f1() {
System.out.println("f1");
}
protected void f3() {
System.out.println("f3");
}
public void f4() {
System.out.println("f4");
}
}
同包下的Children类
public class Children {
public class AChildren extends Parent {
public void f5() {
Parent p = new Parent();
System.out.println(p.a);
System.out.println(super.a);
p.f1();
System.out.println(p.c);
System.out.println(super.c);
f3();
System.out.println(p.d);
System.out.println(super.d);
f4();
System.out.println("f5");
}
}
}
不同包下的Children类
import test3.a.Parent;
public class Children extends Parent{
public void f5() {
Parent p = new Parent();
System.out.println(super.c);
System.out.println(this.c);
this.f3();
System.out.println(p.d);
System.out.println(super.d);
f4();
System.out.println("f5");
}
}
4. super
- super和this的用法相像, this代表本类对象的引用, super代表父类的内存空间的标识
- super.name是从父类中开始查找,直接跳过子类
- 当子类中有和父类的成员(属性和方法)重名时,访问父类的方法通过使用super
- 子类必须调用父类的构造器,完成初始化
- 在构造器中
super()和this()
不能同时出现,但可出现super() ;下一行出现this.name = name
- 在构造器中super和this必须放在代码块的第一行
- 在构造器中父类的构造器可以选择, 只需加上
super("Tom")
即可调用父类带一个参数的构造器
class Base{
public Base(){
System.out.println("Base()方法被调用")
}
public Base(String name){
System.out.println( this.name+ "Base()方法被调用")
}
}
class Sub extends Base{
public Sub(){
System.out.println("Sub()方法被调用")
}
public static void main( String[] args){
Sub sub = new Sub();
}
}
4.1 super和this的区别
NO | 区别点 | this | super |
---|
1 | 访问属性 | 从本类中开始访问属性,如果没有,则往上(父类中)找,直到Object类 | 从父类开始访问属性 |
2 | 调用方法 | 同上 | 从父类开始访问方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在首行 |
4 | 特殊 | 表示当前对象 | 子类中访问父类对象 |
5. 多态
- 编译类型在定义对象时就确定了,不能改变
- 运行类型可以改变
- 等号左边是编译类型,右边是运行类型
如:Animal animal = new Cat("喵小喵");//也可叫做向上转型
- 可以调用父类中的所有成员(遵循访问权限)
调用看编译类型即animal类型
- 不能调用子类中的特有成员
animal.catchMouse()//报错,catchMouse是Cat的特有方法
- 能调用的方法最终运行效果看子类的具体实现, 即:先看子类,子类没有看父类,
- 属性没有重写之说,属性的值直接看编译类型。
5.1 instanceof使用
instanceof
比较操作符,用于判断对象的运行类型是否为xx类型或xx类型的子类型
5.2 向下转型(强转)
public void function(Animal animal){
animal.eat();
animal.shout();
if (animal instanceof Dog) {
((Dog) animal).watchDoor();
}
if (animal instanceof Cat) {
((Cat) animal).obedient();
}
}
6. java.lang.Object对象
Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类, 则默认父类为java.lang.Object类
No | 方法名称 | 类型 | 描述 |
---|
1 | public Object() | 构造 | 构造器 |
2 | public boolean equals(Object obj) | 普通 | 对象比较 |
3 | public int hashCode() | 普通 | 取得Hash码 |
4 | public String toString() | 普通 | 对象打印时调用 |
6.1 ==和equals
- ==:
- 基本类型比较:只用两个变量值相等,即为true
- 引用类型比较引用(是否指向同一个对象):只有指向同一个对象时也就是内存地址相等时才返回true
- equals:
- equals():所有类都继承了Object,也就获得了equals()方法。可以重写,
默认比较内存地址 相等与”==“;
- 特例:当用equals()方法进行比较时,对类file、String、Data及包装类来说,是比较类型及内容而不考虑引用是否是同一个对象;在这些类中重写了Object类的equals()方法
- 当自定义使用equals()时,
可以重写
。用于比较两个对象的”内容“是否相等
6.2 toString
- toString()方法在Object类中定义,其返回值时String类型,返回类名和它的引用地址
- 在进行String与其他类型数据的连接操作时,自动调用toString()方法
Data now =new Data();
System.out.println("now=" + now);相当于
System.out.println("now=" + now.toString());
- 可以根据需要在用户自定义类型中重写toString()方法,如String类重写了toString()方法,返回字符串的值。
s1 = "hello";
System.out.println(s1);
7. 自动装箱和拆箱
- 装箱:基本数据类型包装成包装类的实例
- 通过包装类的构造器实现:
int i = 500;Integer t = new Integer(i);
- 通过字符串参数构造包装类对象:
Float f = new Float("4.56");
- 拆箱:获得包装类对象中包装的基本类型变量,方法时调用包装类的.xxxValue()方法:
boolean b = bobj.booleanValue();
- 自动装箱,自动拆箱:JDK1.5支持自动装箱和拆箱
- 字符串转换成基本数据类型
- 通过包装类的构造器实现:
int i = new Integer("12")
- 通过包装类的parseXxx(String s)静态方法:
Float f = Float.parseFloat("12.1");
- 基本数据类型转换成字符串
- 调用字符串重载的valueOf()方法:
String fstr = String.valueOf(2.34f);
- 更直接的方法:
String intStr = 5 + " "
package test10;
import com.sun.jdi.BooleanValue;
public class Test {
public void Method1() {
Integer n1 = 127;
Integer n2 = 127;
Float f = 123.0f;
Double d = 123.1;
Boolean b1 = false;
System.out.println("=====以上都为装箱======");
Integer i1 = new Integer(123);
Integer i2 = new Integer(123);
int i3 = i1.intValue();
Boolean b2 = new Boolean(false);
boolean b3 = b2.booleanValue();
System.out.println("====下面的为数据值的测试====");
System.out.println(i1 == i2);
System.out.println(i1 == i3);
System.out.println(n1 == n2);
Integer n3 = 128;
Integer n4 = 128;
System.out.println(n1 == n3);
System.out.println(n4 == n3);
}
public static void main(String[] args) {
Test test = new Test();
test.Method1();
}
}
}