福建省建设信息网站,网站建设新技术,山东城建建设职业学院教务网站,中国公司查询网站文章目录 封装什么是封装#xff1f;如何实现封装#xff1f; 继承什么是继承#xff1f;继承的语法父类成员访问子类访问父类的成员变量子类访问父类的成员方法 认识super关键字认识final关键字子类的构造方法super VS this在继承关系中各代码块的执行顺序是怎样的#xf… 文章目录 封装什么是封装如何实现封装 继承什么是继承继承的语法父类成员访问子类访问父类的成员变量子类访问父类的成员方法 认识super关键字认识final关键字子类的构造方法super VS this在继承关系中各代码块的执行顺序是怎样的 Java支持的继承的方式继承 VS 组合 多态什么是多态什么是重写重写 VS 重载 向上转型和向下转型向上转型向下转型 封装
什么是封装
什么是封装呢 简单来说就是套壳屏蔽细节。
比如对我们使用的电脑来说在它运行过程中是有很多的部件相互配合共同执行的。但对于我们使用者而言只需要使用鼠标和键盘就可以操作电脑让它工作。 这其中就是套壳的思想电脑把它的硬件资源全部套壳封装起来只留出几个接口供用户使用就可以和计算机交互。
封装的标准定义将数据和操作数据的方法有机结合隐藏对象的属性和实现细节仅通过对外的公开接口来和对象进行交互。
如何实现封装
Java中主要通过类和访问权限来实现封装。
类可以将数据和封装数据的方法结合在一起。 访问权限用来控制方法和字段能否直接在类外使用。
Java中提供了四种访问限定修饰符来设置访问权限 注 default权限指什么都不写时的默认权限。 继承
什么是继承
Java中使用类来对现实世界中的实体进行描述但是现实世界错综复杂事物之间可能会存在一些关联、一些共性。比如猫和狗他们都是动物因此他们就具有许多相似的属性但又有自己独有的一些属性。比如 具有这些相同属性的类还有很多如果我们在这些类中都重新加上这些属性代码就显的有写累赘。 因此就引入了继承。我们把所有类共同的一些属性写到一个类里把每个类独有的部分再写到一个类中。
继承专门用来进行共性抽取实现代码复用。
共同的部分类叫作父类、基类、超类 独有的部分类叫作子类、派生类
继承的语法
借助extends关键字。
class Animal{public String name;public int age;public double weight;public void eat(){System.out.println(吃饭);}public void sleep(){System.out.println(睡觉);}
}class Cat extends Animal{public void miao(){System.out.println(喵喵叫);}
}class Dog extends Animal{public void bark(){System.out.println(汪汪叫);}
}注 子类会将父类中所有的成员变量、成员方法添加到子类中。子类继承父类后必须新添加自己特有的成员体现出与父类的不同否则就没有必要继承了。 父类成员访问
子类访问父类的成员变量
子类和父类中不存在同名的成员变量
class Animal{public String name; //由于需要被子类对象使用所有用public修饰public int age;
}class Dog extends Animal{public String color;public void method(){name 小黄; // 直接访问父类的age 2; // 直接访问父类的color 黄色; // 访问自己的}
}子类和父类中存在同名的成员变量
class Animal{public String name;public int age;
}class Dog extends Animal{public String name;public String color;public void method(){name 小黄; // 优先访问自己的nameage 2; // 直接访问父类的color 黄色; // 访问自己的}
}注 如果访问的成员变量子类中有优先访问自己的成员变量如果访问的成员变量子类中无则访问父类继承下来的如果父类中也没则编译报错如果访问的成员变量与父类中的成员变量同名则优先访问自己的 子类访问父类的成员方法
成员方法名字不同
class Animal{public void eat(){System.out.println(吃饭);}
}class Dog extends Animal{public void bark(){System.out.println(汪汪叫);}public void method(){bark(); //访问子类自己的eat(); //访问父类的}
}成员方法名字相同
class Animal{public void eat(){System.out.println(动物吃饭);}
}class Dog extends Animal{public void eat(){System.out.println(狗吃饭);}public void method(){eat(); //访问自己的}
}注 通过子类对象访问 父类与子类中不同名的方法时优先在子类中找找到则访问否则在父类中找找到则访问否则编译报错通过子类对象访问 父类与子类中同名的方法时如果父类和子类的同名方法参数列表相同则优先访问子类自己的如果参数列表不同则根据调用方法时传递的参数选择合适的方法访问若没有则报错 认识super关键字
如果子类中存在和父类相同的成员时如何不访问子类的成员而去访问父类的成员呢 这就需要用到super关键字。
super在子类方法中访问父类的成员
class Animal{public String name;public void eat(){System.out.println(动物吃饭);}
}class Dog extends Animal{public String name;public void eat(){System.out.println(狗吃饭);}public void method(){super.name 动物名; //访问父类的成员变量super.eat(); //访问父类的成员方法}
}注 只能在子类方法中使用只能在非静态方法中使用 认识final关键字
final可以被用来修饰变量、成员方法、类
final修饰变量或字段表示常量—不能修改final修饰类表示此类不能被继承finnal修饰方法表示此方法不能被重写多态中会使用到
子类的构造方法
父子父子先有父再有子即子类对象构造时需要先调用父类的构造方法构造父类然后执行子类的构造方法构造子类
class Animal{public Animal(){System.out.println(执行父类构造方法);}
}class Dog extends Animal{public Dog(){System.out.println(执行子类构造方法);}
}//再main中创建子类时结果为
//执行父类构造方法
//执行子类构造方法为什么还会调用到父类的构造方法呢 子类对象中成员是由两部分组成的父类继承下来的成员和子类新增的成员父子父子肯定先有父再有子。因此需要先调用父类的构造方法将从父类继承下来的成员构造完整再调用子类自己的构造方法将自己新增的成员构造完整。 注 如果父类没有定义构造方法在子类的构造方法中第一行会隐含的调用super即执行父类空的构造方法。如果父类定义了无参的构造方法在子类的构造方法中第一行会隐含的调用super即执行父类无参的构造方法。如果父类定义了有参数的构造方法此时编译器不会默认生成隐含的super—因为它不知道参数是啥需要用户显示的指定父类的构造方法。在子类构造方法中使用super…调用父类的构造方法时super必须放在子类构造方法的第一行。super只能在子类构造方法中出现一次且不能和this同时出现。 super VS this
相同点
都是Java的关键字只能在类的非静态方法中使用访问非静态的变量和非静态的方法在构造方法中调用时都必须在构造方法的第一行且不能同时存在。
不同点
this是当前对象的引用即引用当前对象的成员super是从父类继承下来的成员的引用即引用父类中的成员。this是非静态成员方法的一个隐藏参数super不是一个隐藏参数在构造方法中this用来调用本类构造方法super用来构造父类构造方法不能同时出现在一个构造方法里。构造方法中一定存在super的调用用户没有写编译器也会增加但是this用户不写则没有。
在继承关系中各代码块的执行顺序是怎样的
class Animal{{System.out.println(父类执行实例代码块);}static {System.out.println(父类执行静态代码块);}public Animal(){System.out.println(父类执行构造方法);}
}class Dog extends Animal{{System.out.println(子类执行实例代码块);}static {System.out.println(子类执行静态代码块);}public Dog(){System.out.println(子类执行构造方法);}
}
public class test {public static void main(String[] args) {Dog dog new Dog();}
}//结果
父类执行静态代码块
子类执行静态代码块
父类执行实例代码块
父类执行构造方法
子类执行实例代码块
子类执行构造方法注 父类静态代码块优先于子类静态代码块执行且都是最早执行父类实例代码块和父类构造方法再执行子类实例代码块和子类构造方法再执行实例代码块优先于构造方法执行第二次实例化子类对象时父类和子类的静态代码块都不执行 Java支持的继承的方式 继承 VS 组合
组合和继承类似也是一种表达类之间关系的方式。也能够达到代码复用的效果它是将一个类的实例作为另一个类的字段。
//以汽车为例说明继承和组成的不同//轮胎类
class Tire{}//发动机类
class Engine{}//车内系统类
class VehicleSystem{}//组成
class Car{private Tire tire;private Engine engine;private VehicleSystem vehicleSystem;
}//继承 奔驰继承了汽车类
class Benz extends Car{}注 继承表示对象之间是 is-a 的关系即 猫是动物、狗是动物组合表示对象之间是 has-a的关系即 汽车有轮子、发动机、车载系统继承借助extends关键字会自动将父类成员加载到子类中组合需要手动在某个类当中引入其他类的成员 多态
什么是多态
多态即多种形态具体点就是去完成某个行为时不同的对象去完成时会产生不同的状态。
实现多态的条件
必须在继承体系下子类必须对父类方法进行重写通过父类的引用调用重写方法
class Animal{public String name;public int age;public Animal(String name,int age){this.name name;this.age age;}public void eat(){System.out.println(name 吃饭);}
}class Cat extends Animal{public Cat(String name,int age){super(name,age);}Overridepublic void eat() {System.out.println(name cat吃鱼);}
}class Dog extends Animal{public Dog(String name, int age){super(name,age);}Overridepublic void eat() {System.out.println(name dog吃骨头);}
}
public class test {//通过父类调用eat方法才能看出来重写的作用//没有重写时子类中没有eat方法只能使用父类的eat方法不管是哪个子类最后都会打印出 动物吃饭//重写后子类中有重写的eat方法调用父类的eat方法时会自动识别出哪个子类调用的eat方法会打印出对应动物的吃饭////子类有重写方法后当然也可以不通过调用父类eat方法而是直接调用自己重写后的eat方法打印出对应的动物的吃饭//但这样就看不出重写的作用了public static void eat(Animal a){a.eat();}public static void main(String[] args) {Cat cat new Cat(小猫,1);Dog dog new Dog(小狗,2);eat(cat);eat(dog);}
}什么是重写
重写也叫覆盖是子类对父类非静态、非private修饰、非final修饰、非构造方法等的重新编写返回值和形参都不能改变。即外壳不变核心重写。 注 子类在重写父类方法时一般必须与父类方法原型一致即修饰符、返回值类型、方法名、参数列表要完全一致。特殊情况下返回值类型可以不同但是必须具有父子关系。子类中重写方法的访问权限不能比父类方法中的访问权限更低。父类中被static修饰的、private修饰的、final修饰的方法和构造方法不能被重写。重写后的方法要加上 Override 注解。 重写 VS 重载 向上转型和向下转型
向上转型
向上转型实际就是创建一个子类对象将其当成父类对象来使用。
语法格式 父类类型 对象名 new 子类类型 // animal是父类类型但是可以引用一个子类对象 把小范围的对象放到大范围的对象里Animal animal new Dog(小狗,2);使用场景
直接赋值方法传参方法返回 注 向上转型的优点让代码实现更简单灵活。向上转型的缺点不能调用到子类特有的方法。 向下转型
向下转型将子类对象向上转型后就无法调用子类特有的方法但是有时候可能需要调用到子类特有的方法此时就需要向下转型将父类引用再还原为子类对象。 Cat cat new Cat(小猫,1);Dog dog new Dog(小狗,2);//向上转型Animal animal cat;//向下转型: 按道理可以转为继承Animal的任意子类对象 但是有些不安全//必须强制类型转换Cat cat1 (Cat) animal; //安全 因为向上转型时就是Cat转的Dog dog1 (Dog) animal; //不安全 会抛出异常 因为向上转型是Cat转的 但是现在却要把猫类成员赋值给狗类Java中为了提高向下转型的安全性引入了 instanceof 类型匹配 如果为true则可以安全转换。 Cat cat new Cat(小猫,1);Dog dog new Dog(小狗,2);//向上转型Animal animal cat;//向下转型if (animal instanceof Cat){Cat cat1 (Cat) animal;}if (animal instanceof Dog){Dog dog1 (Dog) animal;}