面向对象的三大特征
2023-03-18 15:29:45 2 举报
AI智能生成
面向对象的三大特征
作者其他创作
大纲/内容
多态
- 概念:父类引用指向子类,从而形式多态
- 二者具有直接或者间接的继承关系时,父类的引用才能指向子类
- 父类引用仅可调用父类声明的方法和属性,不可调用子类独有的属性方法
- 二者具有直接或者间接的继承关系时,父类的引用才能指向子类
- 父类引用仅可调用父类声明的方法和属性,不可调用子类独有的属性方法
package com.qf;
public class Pet {
//健康值
int health;
public void toHealth(){
System.out.println("宠物恢复健康");
}
}
public class Pet {
//健康值
int health;
public void toHealth(){
System.out.println("宠物恢复健康");
}
}
package com.qf;
public class Dog extends Pet {
@Override
public void toHealth() {
System.out.println("狗啃骨头,恢复健康");
}
//独有的方法
public void sleep(){
System.out.println("狗睡觉");
}
}
public class Dog extends Pet {
@Override
public void toHealth() {
System.out.println("狗啃骨头,恢复健康");
}
//独有的方法
public void sleep(){
System.out.println("狗睡觉");
}
}
package com.qf;
public class Cat extends Pet {
@Override
public void toHealth() {
System.out.println("猫吃两条鱼,恢复健康");
}
}
public class Cat extends Pet {
@Override
public void toHealth() {
System.out.println("猫吃两条鱼,恢复健康");
}
}
package com.qf;
public class Master {
//看病的方法
//给狗看病
// public void kanBing(Dog dog){
// if (dog.health<80){
// dog.toHealth();
// dog.health=90;
// }
// System.out.println("狗看完病之后的健康值为:"+dog.health);
// }
//
// //给猫看病
// public void kanBing(Cat cat){
// if (cat.health<80){
// cat.toHealth();
// cat.health=90;
// }
// System.out.println("猫看完病之后的健康值为:"+cat.health);
// }
public void kanBing(Pet pet){ //Pet pet=new Cat();
if (pet.health<80){
pet.toHealth();
// pet.sleep(); 错误的 父类引用仅可调用父类声明的方法和属性,不可调用子类独有的属性方法
pet.health=90;
}
System.out.println("看完病之后的健康值为:"+pet.health);
}
}
public class Master {
//看病的方法
//给狗看病
// public void kanBing(Dog dog){
// if (dog.health<80){
// dog.toHealth();
// dog.health=90;
// }
// System.out.println("狗看完病之后的健康值为:"+dog.health);
// }
//
// //给猫看病
// public void kanBing(Cat cat){
// if (cat.health<80){
// cat.toHealth();
// cat.health=90;
// }
// System.out.println("猫看完病之后的健康值为:"+cat.health);
// }
public void kanBing(Pet pet){ //Pet pet=new Cat();
if (pet.health<80){
pet.toHealth();
// pet.sleep(); 错误的 父类引用仅可调用父类声明的方法和属性,不可调用子类独有的属性方法
pet.health=90;
}
System.out.println("看完病之后的健康值为:"+pet.health);
}
}
package com.qf;
public class Test {
public static void main(String[] args) {
//创建主人对象
Master master = new Master();
//创建狗对象
// Dog dog = new Dog();
// dog.health=90;
// //创建猫对象
// Cat cat = new Cat();
// cat.health=60;
// master.kanBingDog(dog);
// master.kanBingCat(cat);
// master.kanBing(dog);
// master.kanBing(cat);
//创建猫类对象
Pet cat=new Cat(); //多态
cat.health=50;
master.kanBing(cat);
Pet pet = new Dog();//向上转型
// pet.sleep();
//向下转型
Dog dog=(Dog) pet;
dog.sleep();
Pet pet1 = new Pet();
if (pet1 instanceof Dog){
// 向下转型
Dog dog1=(Dog)pet1;
dog1.sleep();
}
}
}
public class Test {
public static void main(String[] args) {
//创建主人对象
Master master = new Master();
//创建狗对象
// Dog dog = new Dog();
// dog.health=90;
// //创建猫对象
// Cat cat = new Cat();
// cat.health=60;
// master.kanBingDog(dog);
// master.kanBingCat(cat);
// master.kanBing(dog);
// master.kanBing(cat);
//创建猫类对象
Pet cat=new Cat(); //多态
cat.health=50;
master.kanBing(cat);
Pet pet = new Dog();//向上转型
// pet.sleep();
//向下转型
Dog dog=(Dog) pet;
dog.sleep();
Pet pet1 = new Pet();
if (pet1 instanceof Dog){
// 向下转型
Dog dog1=(Dog)pet1;
dog1.sleep();
}
}
}
Super关键字
含义:直接父类的对象
作用:可以调用父类的属性、方法、构造方法
- 调用父类属性和方法时候:
- 1.当子类和父类有重名属性和重名方法的时候 this属性 this方法 指的都是 子类自己的
- 2.当子类和父类 没有重名属性和没有重名方法的时候 super属性 super方法 指的都是 父类自己的
- 调用父类 构造方法的时候:
- 注意:创建子类对象前,必须要创建父类对象
- 1.super(); 调用的父类的无参构造。是可以完全省略 (前提是必须保留父类的无参构造)
- 2.super调用父类的有参构造的时候,要放在构造方法的第一行,super不可以跟this 一起出现
作用:可以调用父类的属性、方法、构造方法
- 调用父类属性和方法时候:
- 1.当子类和父类有重名属性和重名方法的时候 this属性 this方法 指的都是 子类自己的
- 2.当子类和父类 没有重名属性和没有重名方法的时候 super属性 super方法 指的都是 父类自己的
- 调用父类 构造方法的时候:
- 注意:创建子类对象前,必须要创建父类对象
- 1.super(); 调用的父类的无参构造。是可以完全省略 (前提是必须保留父类的无参构造)
- 2.super调用父类的有参构造的时候,要放在构造方法的第一行,super不可以跟this 一起出现
封装
概念:尽可能的隐藏对象的内部细节,控制对象的修改及访问的权限
问题: 在对象的外部 为对象赋值,可能存在非法录入
就目前的技术而言,并没有办法对属性的赋值进行控制
就目前的技术而言,并没有办法对属性的赋值进行控制
解决方式:- 提供公共访问方法,以保证数据的正常录入
- 命名规范:
- 赋值 setXXX () //使用方法的参数进行 赋值
- 取值 getXXX () //使用方法的返回值进行取值
过滤有效数据
在公共的访问方法内部,添加逻辑判断,进而过滤掉非法的数据,以保证数据的安全
- 命名规范:
- 赋值 setXXX () //使用方法的参数进行 赋值
- 取值 getXXX () //使用方法的返回值进行取值
过滤有效数据
在公共的访问方法内部,添加逻辑判断,进而过滤掉非法的数据,以保证数据的安全
案例:public void setAge(int age){
if (age<150&&age>0){
this.age=age;
}else {
System.out.println("你输入的年龄非法");
}
}
if (age<150&&age>0){
this.age=age;
}else {
System.out.println("你输入的年龄非法");
}
}
解决方式 使用javabeen实体类设计去解决
- JavaBean 分为两种: 1. 数据承载Bean 2.业务逻辑Bean
- 数据承载Bean的要求:
- 1.私有化属性
- 2.对外提供公共的的Get set 方法
- 3.提供有参无参构造
- JavaBean 分为两种: 1. 数据承载Bean 2.业务逻辑Bean
- 数据承载Bean的要求:
- 1.私有化属性
- 2.对外提供公共的的Get set 方法
- 3.提供有参无参构造
案例:public class User {
private String username;
private String password;
public User(){
}
public User(String username,String password){
this.username=username;
this.password=password;
}
public void setUsername(String username){
this.username=username;
}
public String getUsername(){
return username;
}
public void setPassword(String word){
password=word;
}
public String getPassword(){
return password;
}
}
private String username;
private String password;
public User(){
}
public User(String username,String password){
this.username=username;
this.password=password;
}
public void setUsername(String username){
this.username=username;
}
public String getUsername(){
return username;
}
public void setPassword(String word){
password=word;
}
public String getPassword(){
return password;
}
}
四种访问修饰符
public(访问等级更低)
最宽松的访问控制修饰符,被public修饰的字段或者方法在整个工程中可见
protected(访问等级比default低一点)
被protected修饰的字段或者方法,仅在本包可见,或者对其他包的子类中可见,其他包的不同子类之间仍然不可见
defualt(访问等级比provate低一点)
字段或者方法没写访问控制修饰符的情况下,默认就是该访问控制级别,属于default级别的字段或者方法仅在被包内可见
provate(访问等级最高,只能类中被访问)
被private修饰的字段或者方法仅在本类中可见
继承
- 概念:类与类之间的属性和方法的赠与和获得
- 继承的作用:减少代码的冗余 提高代码的复用性
- 语法:子类 extends 父类
- 继承的作用:减少代码的冗余 提高代码的复用性
- 语法:子类 extends 父类
(继承的特点)- 1.子类继承父类。可以继承父类中的属性 方法
- 2.子类也可以拥有自己的属性 方法
- 3.单继承,即在Java中一个子类只能继承一个父类。但是一个父类可以拥有多个子类
- 4.多重继承 一个父类可以继承另一个父类 java中最大的父类 就是Object类 (如果一个类 没有显示写出extends 父类 默认就是继承Object )
- 2.子类也可以拥有自己的属性 方法
- 3.单继承,即在Java中一个子类只能继承一个父类。但是一个父类可以拥有多个子类
- 4.多重继承 一个父类可以继承另一个父类 java中最大的父类 就是Object类 (如果一个类 没有显示写出extends 父类 默认就是继承Object )
注意:- 1.构造方法不可继承
- 2.父类中私有属性不可继承
- 3.父类中使用默认修饰符修饰的属性 和 方法 在不同包的情况下不能继承4.子类的访问修饰符等级不能高于父类的访问修饰符等级
- 2.父类中私有属性不可继承
- 3.父类中使用默认修饰符修饰的属性 和 方法 在不同包的情况下不能继承4.子类的访问修饰符等级不能高于父类的访问修饰符等级
0 条评论
下一页