当前位置: 代码迷 >> 综合 >> java-面向对象特征-day08
  详细解决方案

java-面向对象特征-day08

热度:46   发布时间:2024-02-09 10:40:51.0

继承

1概念

如果多个类的内容出现重复,把重复的内容放到一个新的类中,通过extends关键字让原来的类和新的类产生关联关系—继承。原来的类是子类,新的类是父类。子类可以继承父类部分信息(父类的私有化信息、构造方法以及构造代码块不能被继承)。
package cn.tedu.extendsx;

public class ExtendsDemo1 {
public static void main(String[] args) {
//创建子类对象—医生类对象
Doctor d=new Doctor();
d.treat();
}
}

//定义医疗人员类
//基类、超类、父类
class 医疗人员{
//属性
String name;
int age;
char gender;
//科室
String dept;

//方法
public void treat(){System.out.println(name+"在治病救人...");
}

}
//定义代表医生的类
//通过extends关键字让两个类之间产生关联关系----继承
//派生类、子类
class Doctor extends 医疗人员{
public void treat(){
System.out.println(name+“拿着手术刀在治病救人…”);
}
}

//代表护士的类
class Nurse extends 医疗人员{

}

2、继承方式(单继承)

子类只能有一个父类,一个父类可以有多个子类
Class A extends B{} class B extends C{} class C{}(多级继承)

3.重写(覆盖)

在父子类中出现方法签名一致的方法称之为重写 遵守重写原则(两等两小一大)
方法签名一致(前提)

当父类方法返回值类型是基本类型/void时那么子类方法返回值类型要和父类方法返回值类型保持一致
class A{
public int m(){return 1;}
}
class B extends A{
public int m(){return 2;}
}

当父类方法返回值类型是引用类型时,那么子类方法返回值类型要么和父类方法返回值类型 一致要么是父类方法返回值类型的子类
class A{}
class B extends A{}

class C{
public A m(){return null;}
}
class D extends C{
public A/B m(){return null;}
}
子类方法访问权限修饰符要么和父类方法访问权限修饰符范围一致要么比父类方法访问权限修饰符的范围要大
class A{
void m(){}
}
class B extends A{
public void m(){}
}
访问权限修饰符—控制在哪个位置关系(定义信息地方和获取信息的地方产生四种位置关系—本类、同包类、其他类、子类)下可以获取定义的信息

                     本类         同包类     子类             其他类public             可以         可以         可以              可以protected          可以         可以         可以              不可以默认(不写)          可以         可以         同包子类           不可以private            可以         不可以        不可以            不可以

4、super

a.关键字,代表父类对象
b.super语句—在子类构造方法里调用父类构造方法 首行使用
c.每个子类构造方法里默认调用父类无参构造,如果父类没有提供无参构造需要每个子类构造方法里手写super有参调用对应的父类有参构造
d.父类对象优先于子类对象先出现
e.父子类执行顺序(对象级别)—父类构造代码块-父类构造方法-子类构造代码块-子类构造方法
package cn.tedu.extendsx;

public class ExtendsDemo3 {
public static void main(String[] args) {
//创建子类对象
Pig p=new Pig(1);
//p.eat();
}

}

//定义代表动物的类
class Animal{

//父类构造方法

/* public Animal(){
System.out.println(“父类无参构造”);
}*/
public Animal(String s){

}public void eat(){System.out.println("在吃东西...");
}
public void sleep(){System.out.println("在睡觉...");
}

}

//定义代表猪的类
class Pig extends Animal{

//父类对象优先于子类对象先出现//子类无参光构造
//子类所有的构造方法中都有默认调用父类的无参构造
//如果父类没有提供无参构造,每个子类构造方法都要手写super有参语句调用父类有参构造
public Pig(){//super语句---调用父类构造方法,要在首行super("sd");System.out.println("子类无参构造");
}public Pig(int i){//super("123");System.out.println("子类有参构造");
}//重写eat方法
public void eat(){System.out.println("在无忧无虑的吃东西。。。");System.out.println("吃着吃着吃饱了。。。想睡觉。。。");//java中所有的非静态方法与属性都需要通过对象调用//this?代表当前类的对象//super代表父类"对象"可以调用父类里的信息super.sleep();
}

}

多态

1、概念

挡代码执行过程中呈现多种形式
java分为编译 时期、运行时期
编译时多态—在编译时期绑定代码–体现形式==重载
public void m(){}
pudlic void m(int i){}

运行时多态–在运行时期绑定代码–体现形式==重写、向上造型(继承)

2、向上造型

可以调用哪些方法看父类。方法的具体执行看子类(父类—目录
子类—正文)
package cn.tedu.duotai;

public class DTDemo {
public static void main(String[] args) {
/* //养个宠物
Pet p;
//养的宠物就是一条狗
p=new Dog();*/

    //左边声明类是父类,右边实际创建类是子类---向上造型Pet p=new Dog();//向上造型对象可以调用哪些方法看父类//方法的具体执行要看子类是否有重写方法p.eat();//调用方法//匿名对象是当做参数来传递m(new Pet());m(new Dog());m(new Cat());}
//可以接收本类对象以及所有的子类对象
public static void m(Pet p){//=new Pet();  =new Dog();  =new Cat();p.eat();
}

}

//定义代表宠物的类
class Pet{
public void eat(){
System.out.println(“在吃东西。。。”);
}
public void sleep(){
System.out.println(“在睡觉。。。”);
}
}

//定义代表狗的类
class Dog extends Pet{
//重写eat方法
public void eat(){
System.out.println(“在呼哧呼哧的吃。。。”);
}
public void brak(){
System.out.println(“在汪汪汪的叫。。。”);
}
}

//定义代表猫的类
class Cat extends Pet{
//重写eat方法
public void eat() {
System.out.println(“在呼哧呼哧的吃。。。”);
}

public void 磨爪子(){System.out.println("在哼哧哼哧的磨爪子。。。");
}

}

3、解释重写原则(反证法)

1、子类方法访问权限修饰符要么和父类方法访问权限修饰符范围一致要么
大于父类烦人方法访问权限修饰符范围
class A{
public void m(){}
}
class B extends A {
void m(){}
}

A a=new B();//向上造型、声明类时A类可以调用A类里m方法、表面这个m
可以在任意位置被调用
a.m();//向上造型对象调用方法具体执行看子类是否有重写方法。执行B类里的
m方法、表面m方法同包范围内被调用,此前后有矛盾,代码错误的

2、当父类方法返回值类型是引用类型时、那么子类方法返回值类型要么和父类
方返回值类型一致要么是父类返回值类型的子类
class A{
}
class B extends A{}
class C{
public B m(){return null;}
}
class D extends C{
public A m(){return null;}
}

C a=c.D();//向上造型对象c、调用声明类c类m方法返回B类对象可以获取B类里烦
的信息。
A a=c.m();//向上造型执行具体方法看子类D类、调用m方法返回A类对象、由a对象可以获取
A类里信息。此时前后矛盾,证命带吗是错误的
4.多态的优点
1.统一参数类型
2.降低耦合度(高内聚。低耦合)
案例;
图形类(两个私有化属性(长和宽)。通过有残参构造赋值、提供求周长和面积方法)
鞠兴磊(通过有参构造赋值、提供周长和面积方法)正方形类(通过有参构造方法赋值、
提供求周长和面积方法)

  相关解决方案