10
形参和实参:
- 形参 : 定义方法时参数列表上的变量
- 实参 : 调用方法时传进去的值
- 基本数据类型做参数 , 形参的改变不影响实参的值
- 引用数据类型做参数 , 形参的改变影响实参的值 (String 和 基本数据类型包装类除外)
多态
三个前提:
- 有继承或实现关系
- 有方法的重写
- 父类的引用指向子类的对象
调用
调用关系 | 成员变量 | 成员方法 | 静态变量 | 静态方法 | 父类独有 | 子类独有 |
---|---|---|---|---|---|---|
向上转型 Animal ani = new Cat(); | 父类 | 子类 | 父类 | 父类 | 父类 | 不能调用 |
向下转型 Cat cat = (Cat) ani; | 子类 | 子类 | 子类 | 子类 | 父类 | 子类 |
不转型 | 子类 | 子类 | 子类 | 子类 | 父类 | 子类 |
两种转型
向上转型 :
父类名 父类对象名 = new 子类名;
Animal ani = new Cat;
向下转型 :
子类名 子类对象 = (子类名)父类对象名;
Cat cat = (Cat) ani;
public class Futher{
String name;
public void show() {
System.out.println("FutherName:"+name);
}
public static void main(String[] args) {
Futher fu = new Futher();
fu.name = "张飞";
fu.show();//张飞
Son so = new Son();
so.name = "张苞";
so.show();//张苞
Futher fut = new Son();
fut.name = "张苞";
fut.show();//null
}
}
class Son extends Futher{
String name;
public void show() {
System.out.println("SonName:"+name);
}
}
注意事项:
- 多态只能调用父类方法和重写方法 , 不能调用子类特有的方法
- 如果要调用子类特有的方法 , 需要向下转型
抽象
- 用abstract修饰的类
- 当我们使用的方法没有方法时 , 可以将方法修饰为抽象的
抽象类定义格式:
abstract class 类名{
}
抽象方法格式 :
abstract 修饰符 返回值类型 方法名(参数列表);
注意事项:
- 含有抽象方法的类一定是抽象类 , 但是抽象类里面不一定有抽象方法
- 抽象类中可以定义构造方法 , 但是不可以创建对象
- 抽象类本身无意义 , 所以应该用一个类去继承它 , 然后重写里面所有的抽象方法 . 如果不想实现其中的抽象方法 , 那么这个类本身应该是一个抽象类
- 抽象类中的构造方法本身无意义 , 但是可以用于给子类对象初始化
- final和abstract不能共存 , 因为final修饰的类不能被继承 , 而被abstract修饰的类必须要继承
- 如果想要使用抽象类对象 , 可以使用抽象类多态的形态
public class AbstractDemo1 {
public static void main(String[] args) {
Shape s1 = new Rect(2.2,3.5);
s1.area();
s1.primeter();
Shape s2 = new Circle(3.2);
s2.area();
s2.primeter();
}
}
abstract class Shape{
public abstract void primeter();
public abstract void area();
}
class Rect extends Shape{
double height;
double length;
public Rect() {
super();
}
public Rect(double height, double length) {
super();
this.height = height;
this.length = length;
}
@Override
public void primeter() {
System.out.println("矩形的周长为:"+2*(height+length));
}
@Override
public void area() {
System.out.println("矩形的面积为"+(height*length));
}
}
class Circle extends Shape{
double r;
public Circle() {
super();
}
public Circle(double r) {
super();
this.r = r;
}
@Override
public void primeter() {
System.out.println("圆的周长为:" + 2*3.14*r);
}
@Override
public void area() {
System.out.println("圆的面积为:" + 3.14*r*r);
}
}
接口
- 功能的拓展
定义格式:
interfa 接口名{
}
接口实现格式:
class 类名 implements 接口1,接口2{
}
注意事项:
- 接口中默认所有方法都是抽象的(jdk1.8之前) , 默认是public static 修饰
- 接口中没有构造方法
- 接不能创建对象 , 若想使用接口对象 , 可以通过向上转型 , 使用多态的形式
- 接口中所有的变量默认是常量
- 如果想使用接口 , 则要通过 implements 实现接口
- 接口的子类要实现接口中所有的抽象方法 , 或者自己是一个抽象类
- 一个类可以实现多个接口 , 并且可以在继承类的同时实现多个接口 , 类和接口之间是实现关系
- 接口和接口之间是继承关系 , 接口可以多继承
public class InterfaceDemo1 {
public static void main(String[] args) {
InterfaceA a = new Print();
a.printCapitalLetter();
System.out.println();
InterfaceB b = new Print();
b.printLowercaseLetter();
}
}
interface InterfaceA{
public void printCapitalLetter();
}
interface InterfaceB{
public void printLowercaseLetter();
}
class Print extends Test implements InterfaceA,InterfaceB{
@Override
public void printLowercaseLetter() {
for(char i='a';i<='z';i++) {
System.out.print(i + " ");
}
}
@Override
public void printCapitalLetter() {
for(char i='A';i<='Z';i++) {
System.out.print(i + " ");
}
}
}
class Test{
}
抽象类和接口的区别 :
- 一个类最多只能继承一个抽象类 , 但是可以实现多个接口
- 接口只能继承接口 , 但不能实现接口 , 可以多继承
- 抽象类中既可以定义变量又可以定义常量 . 接口中只可以定义常量
- 抽象类中既可以定义抽象方法 又可以定义非抽象方法 . 接口中只可以定义抽象方法(jdk1.8以前)+
- 抽象类中有构造方法 , 接口中没有构造方法