JAVA_XXBJ(11)面向对象:封装,继承,多态

本文详细介绍了面向对象的基本概念,包括封装、继承和多态等核心特性。通过具体的Java代码示例,展示了如何利用这些特性进行程序设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象

Java是面向对象的,c语言是面向过程的,那么什么叫面向对象呢,打个比方:去餐厅吃饭,你点了一大桌的菜,你只需要吃就行了,而不用管他是怎么烧的,你所要面对的就是美味佳肴,而这些菜怎么做的你并不需要管。

面向对象的三大特征:封装,继承,多态

封装

封装(Encapsulation): 是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
其实我们之前已经接触过封装了,public所修饰的就是封装。封装是通过限制只有特定类的对象可以访问这一特定类成员,成员的权限分为三种:公有成员(public),私有成员(private),保护成员(protected)。
范围

下面举一个private栗子:

public class book {
  private String author;
  private String name;
  private int price;
  
  public book(){
   
  }
  public book(String author, String name, int price) {
   //super();
   this.author = author;
   this.name = name;
   this.price = price;
  }
  public String getAuthor() {//获取Author
   return author;
  }
  public void setAuthor(String author) {//改变Author
   this.author = author;
  }
  public String getName() {//获取name
   return name;
  }
  public void setName(String name) {//改变name
   this.name = name;
  }
  public int getPrice() {//获取price
   return price;
  }
  public void setPrice(int price) {//改变price
   this.price = price;
  }
  
}

private将变量设置为私有属性,使得无法对其访问,这样约束了对变量的访问,外部调用的不会无意的将其内部的值修改。那么如何调用,如何修改呢?这就要使用get,set。get是获取,set是改变。
快捷创建get set
右键->source,选择Generate Getters and Setters
在这里插入图片描述
选择你要添加的get 和 set。
那么在其他函数中调用的如下:

public static void main(String[]args){
   book book = new book("张三","java编程思想",85);
  book.setAuthor("李四");
  System.out.println(book.getAuthor()); 
 }

输出的结果是 李四。

继承

继承(Inheritance): 是指在某种情况下,一个类会有“子类”,子类比原本的类(称为父类)要更加具体化。关键字是 extends。子类可以继承(拥有)父类可被继承的功能和属性(私有化出外),同时还可以创建 自己的功能和属性。
打个比方,有句老话叫“龙生龙,凤生凤,老鼠的儿子生来会打洞”,其实就是子继父,子类有父类的所有,当然父类也有私有的(private),子类也会有比父类多的地方。
关键词extends用在类后面,就像这样:
父类:

public class Person {//人这个类型:Person 人->特征
 String name;//
 int age;
 String address;
 int IdCard;
 public  Person(){
  System.out.println("这是无参构造方法");
 }
public void eat(){//函数
  System.out.println("吃");
 }
 public void drink(){
  System.out.println("喝");
 }
 public void play(){
  System.out.println("玩");
 }
 public void happy(){
  System.out.println("乐");
 }
}

子类:


public class Student extends Person{
 String StuID;
 public void study(){
  System.out.println("当前工作:学习");
 }
}

学生(student)继承(extends)人类(person),学生是子类。虽然子类(student)中只有有一个StuID,但由于继承person,他就同样拥有name age address IdCard这些变量(特征),包括函数,反观父类(person),他并不会有StuID这个变量。
注意:在Java中,继承关系是单继承关系,Object是所有类的父类。所以虽然子类(student)继承父类(person),但子类(person)继承父类(Object),所以子类(student)中同样会有Object的函数。

多态

多态(Polymorphism): 是同一个行为具有不同表现形式的能力。(同一种事物的不同表现形式),多体现在方法上面。
实现多态有两种机制,分别是:重载和重写。
重载: 同一个类当中,函数名相同,参数列表不同。叫做重载。

public class Student extends Person{
 String StuID;
 public void study(){
  System.out.println("当前工作:学习");
 }
 public void study(String a){
  System.out.println("输出"+a);
  
 }
}

上面这段就是对student.study()进行了重写,在选择使用哪个函数的时候,通过后面的参数列表,根据就近原理(形式相近)来确定。

重写: 在继承关系当中,方法签名相同(方法名和参数列表都相同),方法体不同,叫做重写。也可以说是覆盖。

public class Student extends Person{
 String StuID;
 public void study(){
  System.out.println("当前工作:学习");
 }
 public void study(String a){
  System.out.println("输出"+a); 
 }
 public void eat(){//方法
  System.out.println("学生吃苦才有甜");
 }
}

在上面的代码中,加入eat(),这个函数在父类(person)中已经有了,且他们的方法签名相同,这时候就产生了覆盖的效果。在main函数中加入以下代码:

public static void main(String[]args){
 Student stu = new Student();
  stu.study("100");
  stu.age=18;
  stu.StuID="202002022020";
  stu.eat();
  Person ss = new Person();
  ss.eat();
}  

我们能够发现,子类中只有一个eat(),而这个eat()就是重写的那个,返回来看父类中的eat(),只有是父类的对象才会有这个函数。
**向上造型:**父类声明子类对象。
父类声明子类对象:ex:Person s = new student ()
该对象(s)拥有的属性和方法是父类的,但是,当调用子类重写父类的方法的时候,
编译期间执行的是父类的方法,运行期间执行的是子类的方法。
看下面的代码:

  public static void main(String[]args){
 Student stu = new Student();
  stu.study("100");
  stu.age=18;
  stu.StuID="202002022020";
  stu.eat();
  Person ss = new Person();
  ss.eat();
   Person pp = new Student();//向上造型
  pp.eat();
}  

这时候输出的是子类(student)中的eat(),但编译的时候是使用的父类(person)中的eat()。

例子

主函数:

public class Question_Test {
 public static void main(String[] args) {
  Single_Question single = new Single_Question();
  single.title = "1,以下4人,谁的功夫高()?";
  single.choice = new String []{"A.叶问","B.张师傅","C.李师傅","D.罗师傅"};
  System.out.println(single.title);//控制台显示问题
  for(int i = 0 ;i<=single.choice.length-1;i++){//循环,挨个输出选项
  System.out.println(single.choice[i]);
  }
  System.out.println("请输入答案:");
  single.answer='A';//标准答案赋值
  Scanner scanner = new Scanner(System.in);
  String answer = scanner.next();
  //将字符串转换成字符数组插入[]
  char [] answers = answer.toCharArray();
  single.check(answers);//调用子类中的检查函数
  boolean flag = single.check(answers);
  if(flag==true){
   System.out.println("回答正确");
  }else{
   System.out.println("回答错误");
  } 
 }
}

父类

public class Question {
 String title;//题干
 String [] choice;//选项
 char [] answers;//输入的答案
 //检测函数,检测答案是否正确
 public boolean check (char [] answer){
  return false;
 }
}

子类

public class Single_Question extends Question {
 char answer;//标准答案 
 public boolean check(char [] answers){//Boolean类,比较    //重写
  if(answers[0] == answer){
   return true;
  }else{
  return false;
  }
 }
}

(个人学习总结,如有错误,敬请斧正,学习时间,20,11)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值