复习:
封装:
属性 隐藏 : 对属性 封装
修饰符 : private 私有的
默认的
protected 保护的
public 公有的
方法的实现 隐藏(将代码封装在一个jar包中)-->增强代码的复用性
package com.briup.ch7;
public class Pic{
public void show(){
for(int i = 0;i<10;i++){
for(int j = 0;j<10;j++){
System.out.print("*");
}
System.out.println();
}
}
public void show(int num){
for(int i = 0;i<num;i++){
for(int j = 0;j<num;j++){
System.out.print("*");
}
System.out.println();
}
}
}
package com.briup.ch7;
public class PicTest{
public static void main(String[] args){
Pic p = new Pic();
p.show(5);
}
}
javac -d bin src/Pic.java //先写一个Pic类,编译后放在bin目录下
cd bin
jar -cvf briup.jar com/briup/ch7/*.class //将Pic.class打包成briup.jar,,,同时会把com,briup,,,文件夹也同时打包
-c 创建新的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
cd ..
mv bin/briup.jar ./ //将briup移动到与bin同级;;;bin briup.jar src
//也可以不用移动出来,编译的时候修改一下briup.jar的路径就可以
chmod 777 briup.jar //修改权限;;;如果没报这个错误,可以不用修改
编译 : javac -cp briup.jar -d bin src/PicTest.java //将PicTest.java编译
// -d <目录> 指定放置生成的类文件的位置
//-cp <路径> 指定查找用户类文件和注释处理程序的位置
运行 : java -cp briup.jar:bin com.briup.ch7.PicTest //运行PicTest;;用 : 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
// -cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 : 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
注意代码的通用性 添加参数,改善通用性
方法重载,可以增强方法名的功能(方法名相同,参数列表不同)
构造器:配合new关键字创建对象(没有返回值,不能写返回类型,否则就是普通方法)
有参构造器,对成员变量进行初始化
对象创建:
1,分配空间,默认初始化
2,显示初始化
3,调用构造器
4,返回地址
继承:
创建子类对象的时候,先创建父类对象
在子类的构造器中默认第一句就是调用父类构造器
特点:java中是单继承。
如果不写extends某一个父类,
那么所有类都默认继承Object
重载:Overload
一个类中
方法名相同,参数列表不同
重写:Override --> 把父类中的方法覆盖 , 实现父类满足不了的功能
子父类中
方法名 参数列表 返回值类型 保持一致
异常不能被放大
权限不能被缩小(public,protected,private,默认)(可以放大权限!)
package com.briup.ch7;
public class Test5{
public static void main(String[] args){
System.out.println( new Emp(3,"tom") );
Emp p = new Emp(6,"lisi");
Emp e = new Emp(6,"2tom");
//地址
System.out.println( e == p );
System.out.println( e.equals(p) );
System.out.println(e);
System.out.println(e.toString());
}
}
//重写object中的toString方法
class Emp{
private int id;
private String name;
//提供构造器 对属性进行赋值
public Emp(int id,String name){
this.id = id;
this.name = name;
}
//重写父类的toString方法
public String toString(){
return id+"--"+name;
}
//重写equals
public boolean equals(Emp emp){
//this 和 emp比较
return true;
}
}
直接打印对象,默认调用object中的toString,打印对象所在的地址
Emp e = new Emp;
System.out.println(e);
System.out.println(e.toString());
//可以重写toString对象,return你想要的返回结果;;比如对象的各个属性
String类重写了equals方法;所以比较的是值;在object类中的比较的是地址
静态方法不存在重写这一说法:
子类可以定义与父类的静态方法同名的静态方法
(但是这个不是覆盖)
父类中静态方法不能被子类覆盖为非静态方法
父类的非静态方法不能被子类覆盖为静态方法;
抽象方法:
a. 父类的抽象方法可以被子类覆盖为非抽象方法: 子类实现父类抽象方法;
b. 父类的抽象方法可以被子类覆盖为抽象方法: 重新声明父类的抽象方法;
c. 父类的非抽象方法可以被子类覆盖为抽象方法;
super:调用和区分子类和父类的方法(同名时)
调用方法和属性:super.show(); super.name ;
调用构造器:super(参数);//只能位于构造器的第一句
多态:子类必须有重写父类的方法,这样才能展现出一种方法的多种形态。父类引用可以调用子类中重写的方法与父类中所有的资源
代码变得灵活;;;缺点:子类中特有的(在父类中没有声明)方法,调用不到
父类的变量指向子类的的对象
多态出现在 具有继承关系的两个类对象之间,
语法: 父类 变量名 = new 子类();
接口 变量名 = new 实现类();
使用多态的对象调用方法时:
编译: 看父类中是否有这个方法/接口中是否有这个方法
运行: 执行具体实现类中的方法
package com.briup.ch7;
public class Test7{
public static void main(String[] args){
//多态
F4 f = new Z4();
//缺点 : 子类中特有的方法调用不到
new Z4().show();//正常
//在编译时候检查,当前变量是否包含调用的方法,如果包含变量即将要调用的方法,编译通过,如果变量不包括即将要调用的方法,编译失败.
f.show();//错
}
}
class F4{}
class Z4 extends F4{
public void show(){}
}
引用数据类型的 转换:
隐式转换 : 小类型转换为大类型
Student stu = new Student();
Object obj = stu;//正常
强制类型转换: 大类型转换为小类型
PoFu f = new PoFu();
PoZi z = (PoZi)f;//错误
PoFu f = new PoZi();
PoZi z = (PoZi)f;//正确
得到结论:只能强制转换为 对象的实质数据类型