当前位置: 首页 > news >正文

编程语言05:面向对象

一、定义

使用步骤:

1.定义类
2.创建对象
3.调用类的属性和方法

(一)定义类

1.java

        一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
        实际开发中建议还是一个文件定义一个class类。

(1)语法

class 类名{1.成员变量(代表属性,一般是名词);2.成员方法(代表行为,一般是动词);3.构造器(后面学习);4.代码块(后面学习);5.内部类(后面学习);
}

        类名前可以public、private、protected等修饰词修饰,但不是必不可少。这些名词的含义见后续总结。 

(2)示例

package Day7_Object;public class L01_GirlFrend {// 1.定义属性String name;String address;int age;int height;double weight;// 2.方法public void Cooke() {System.out.println("会做饭~~");}public void Sing() {System.out.println("会唱歌~~");}public void Dance() {System.out.println("会跳舞~~");}public void Draw() {System.out.println("会画画~~");}public void Shopping() {System.out.println("会购物~~");}
}

 2.python

(二)类属性

1.java

        成员变量(类属性)的完整定义格式是:修饰符 数据类型 变量名称=初始化值; 一般无需指定初始化值,存在默认值。一般创建对象后赋值。

package Summarize;public class Property {public static void main(String[] args) {// 1.用类名调用类属性(定义成员属性前需要加static修饰词)System.out.println(Phone.brand);System.out.println(Phone.price);// 2.用对象名调用类属性(定义对象属性时,属性前不可加static,否则无法获取)Radio r = new Radio("德生",18);System.out.println(r.name);System.out.println(r.width);;}}
class Phone{// 属性static String brand="华为";static int price=1819;// 方法public void call() {System.out.println("打电话~~");}public void PlayGame() {System.out.println("玩游戏~~");}
}
class Radio{String name;int width;public Radio(String name, int width) {this.name = name;this.width = width;}public void broadcast() {System.out.println("播放广播~~");}
}

2.python

class Student():School="中楼小学"Headmaster="王廷新" # 校长def study(self):print("学习知识~~")def play(self):print("课间嬉戏~~")
s1=Student()
print(s1.School)
print(s1.Headmaster)
print(Student.School)
print(Student.Headmaster)
s1.study()
s1.play()

(三)类方法

(四)构造方法

1.java

(1)构造方法

构造方法也叫作构造器、构造函数。
作用:在创建对象的时候给成员变量进行赋值的。

(2)示例代码:

package Summarize;public class L04_02 {public static void main(String[] args) {Student s1 = new Student("柯伊诗",18);s1.info();}
}
class Student{String name;int age;// 1.空参构造public Student() {}// 2.有参构造public Student(String name, int age) {this.name = name;this.age = age;}public void info() {System.out.println("学生信息\n"+"姓名:"+this.name+"年龄:"+this.age+'岁');}}

(3快捷生成构造方法

第1步: 在IDEA中按Alf+Fn+Insert,在弹出如下窗口中选择Constructor;

第2步:弹出如下窗口

第3步:点击Select None,则会生成一个空参构造,如下图所示。

第4步:重复第1步和第2步,在弹出的窗口中按Ctrl+A后如下图。

第5步:点击OK,生成一个带有全部参数的构造方法如下图。

python

通过在__init__()中设置参数,控制创建对象时是否传递对象属性。

(1)空参构造

class Student():def __init__(self):passdef info(self):print(f"学生信息")
s=Student()
s.info()

(2)有参构造

class Student():def __init__(self,name,age):self.name=nameself.age=agedef info(self):print(f"学生信息\n姓名:{self.name},年龄:{self.age}")
s=Student("柯伊诗",18)
s.info()

(五)私有属性和方法

1.java

(1)特点

1)私有属性的特点

a.private是一个权限修饰符
b.可以修饰成员(成员变量和成员方法)
c.被private修饰的成员只能在本类中才能访问

package Summarize;public class L04_03 {public static void main(String[] args) {Fruit f = new Fruit("香蕉",3);f.info();//在类外面访问无法访问私有属性和方法,如果强制访问则会报错//f.name;//f.color;}
}
class Fruit{private String name;private int diameter;//直径public void info() {System.out.println("名称:"+name+",果径:"+diameter);}private void color() {System.out.println("水果的颜色:红色~~");}public Fruit(String name, int diameter) {this.name = name;this.diameter = diameter;}
}

(2)获取和修改私有属性

由于被private修饰的成员只能在本类中才能访问,所有同样可以使用仿照python,可以在类里面定义两个方法来获取和修改。通学这两个方法的命名为get__xx,set__xx,当然使用其他名称也可以。

package Summarize;public class L04_03 {public static void main(String[] args) {Fruit f = new Fruit("香蕉",3);f.info();System.out.println(f.getName());System.out.println(f.getDiameter());}
}
class Fruit{private String name;private int diameter;//直径public void info() {System.out.println("名称:"+name+",果径:"+diameter);}private void color() {System.out.println("水果的颜色:红色~~");}public Fruit(String name, int diameter) {this.name = name;this.diameter = diameter;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getDiameter() {return diameter;}public void setDiameter(int diameter) {this.diameter = diameter;}
}

(3)快速生成set和get方法

该方法可以使用IDEA,使用快捷键Alf+Fn+Insert快速生成set__xx和get_xx方法。

步骤:

第1步:在IDEA中按Alf+Fn+Insert,弹出如下窗口;

第2步:选择Getter and Setter

第3步:弹出如下窗口

第4步:按Ctrl+A全选

 

第5步:点击OK,即可生成set_xx和get_xx方法,生成的结果如下图

2.python

(1)私有属性的特点

a.设置私有权限的方法:在属性名和方法名 前面 加上两个下划线__。
b.私有属性和私有方法只能在类里面访问和修改。
c.在类外面访问和修改私有属性和方法会报错。
d.私有方法不能被继承。

class Father():def __init__(self,name,age):self.name=nameself.age=ageself.__money=1000def info(self):print(self.name)print(self.age)def __GirlFrend(self):print("找女朋友~~")def skill(self):self.__GirlFrend()print("钓鱼~~")def fight(self):print("打仗~~")def get__money(self):return self.__moneydef set__money(self):self.__money=2000class Son(Father):pass
f1=Father("朱元璋",28)
f1.info()
f1.set__money()
print(f1.get__money())
f1.fight()# 不能在类外面访问对象的私有属性和方法
# print(f1.__money)
# f1.__GirlFrend()s1=Son("朱棣",2)
s1.info()
s1.fight()
# 子类无法继承父类的私有属性和方法
# print(s1.__money)
# s1.__GirlFrend()

(2)获取和修改私有属性

        由于私有属性和私有方法只能在类里面访问和修改,因此可以在类里面定义两个方法来获取和修改。通学这两个方法的命名为get__xx,set__xx,当然使用其他名称也可以。

class Father():def __init__(self,name,age):self.name=nameself.age=ageself.__money=1000def info(self):print(self.name)print(self.age)def __GirlFrend(self):print("找女朋友~~")def skill(self):self.__GirlFrend()print("钓鱼~~")def fight(self):print("打仗~~")def get__money(self):return self.__moneydef set__money(self):self.__money=2000class Son(Father):pass
f1=Father("朱元璋",28)
f1.info()
f1.fight()
f1.set__money()
print(f1.get__money())

(六)this和self

java中的关键字this和python中的self用法差不多。

1.java

(1)成员变量和局部变量,前者在类中生效,后者只在方法内部生效。java中同名变量的调用原则:谁离我近,我就用谁

下面示例代码中info方法中参数name及其中的age变量,均为局部变量。

package Summarize;public class L04_05 {public static void main(String[] args) {GirlFrend g = new GirlFrend();g.info("张三");}
}
class GirlFrend{String name;private int age;public void info(String name) {int age=10;System.out.println("姓名:"+name+",年龄:"+age);}}

(2)this的作用

a.有点类似python中的self,指调用对象本身;
b.可以用来区分成员变量和局部变量;
c.this:理解为一个变量,表示当前方法调用者的地址值(黑马老师阿玮讲解,未理解,感觉python应有类似机制,查资料完善这块知识点);
d.访问成员变更、成员方法、构造方法;
​​​​​e.调用的成员变量前默认有一个this;
f.static修改的成员方法不可以使用this,因非静态的东西跟对象有关,所以不能使用this,否则会报错。

2.python

python中self是指调用某类属性和方法的对象。

下述图片来源python黑马笔记。

二、封装

(一)java

1.什么是封装?

概念:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

告诉我们,如何正确设计对象的属性和方法。
原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

2.理解封装思想的好处?

让编程变得很简单,有什么事,找对象,调方法就行。
降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些
方法,有需要时去找就行

3.封装的概念(其他资料)

        封装是指将对象的状态(属性)和行为(方法)包装在一起,形成一个独立的单元,并通过访问修饰符来控制对这些属性和方法的访问权限。

        封装的主要目的是:

        (1)数据隐藏:将对象的内部实现细节隐藏起来,只暴露必要的接口,防止外部直接访问和修改对象的内部状态,提高代码的安全性和可维护性。

        (2)提高内聚性:将相关的数据和行为封装在一起,使对象的功能更加明确和集中。

        (3)增强对象的稳定性:通过合理的封装,可以更好地控制对象的状态变化,避免不恰当的操作导致对象的不稳定。

4.标准javabean类

(二)python

1.什么是封装?

封装将属性和方法书写到类的里面的操作即为封装。

2.封装的作用

装封装可以为属性和方法添加私有权限

三、继承

(一)概念

1.java

        什么是继承、继承的好处?
        继承是面向对象三大特征之一,可以让类跟类之间产生子父的关系。
可以把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码冗余,提高代码的复用性。

2.python

        Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。

        在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。

(二)语法

java

特点:java不支持多继承,但是支持多层继承。

class 子类 extends 父类 {}

python

特点:python支持多继承,同时支持多层继承。

class 子类(父类1,父类2):

示例:

package Summarize;public class L04_06 {public static void main(String[] args) {Youth Tom = new Youth();Tom.drive();Tom.play();}
}
class Father{public void drive() {System.out.println("开车");}
}
class Youth extends Father{public void play() {System.out.println("玩游戏");}
}

示例:

class Father():def Drive(self):print("开车")
class Mather():def Cook(self):print("做饭")
class Teather():def Writinge(self):print("写字")
class Youth(Father,Mather,Teather):# 青年def Play(self):print("玩游戏")
Tom=Youth()
Tom.Drive()
Tom.Cook()
Tom.Writinge()
Tom.Play()

(三)调用父类同名方法

1.java

2.python

子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。

(1)mro

        在python里面,一个class,如何从他的父类里找应先使用哪个父类的函数,这个顺序叫mro。mro英文全称method resolution order,含义是方法解释顺序。

        获取mro的方法

方法1:类名.mro() # 返回一个列表
方法2:类名.__mro__ # 返回一个元组

        mro排序的底层机制比较复杂。如果项目的继承结构比较复杂,一定要设计出清晰继承结构,否则可能出现继承顺序混乱,从而导致出错。

本知识资料来源:https://www.bilibili.com/video/BV1V5411S7dY?vd_source=4786f682d55e0415f381ab2f415da999 

(2)supper

supper是一个python内置类。

(四)重写

1.java

2.python 

子类重写父类同名方法和属性。

四、多态

五、抽象类

六、修饰词


http://www.mrgr.cn/news/77687.html

相关文章:

  • 自动驾驶---E2E架构演进
  • PDF转文本以及转图片:itextpdf
  • ubuntu设置开机无需输入密码自启动todesk,内网穿透natapp
  • 【Uniapp-Vue3】v-for列表渲染的用法
  • 硬件设计-齐纳管
  • 如何将文件从 C 盘传输到 D 盘/移动硬盘
  • Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题
  • npm上传自己封装的插件(vue+vite)
  • 山东春季高考-C语言-综合应用题
  • DatePicker 日期选择器的使用(当日、近一周、近一月...)
  • SpringBoot集成 Jasypt 实现数据源连接信息进行加密
  • 视频对接rtsp协议学习
  • Elasticsearch是如何实现Master选举的?
  • transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景
  • Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制
  • 【Linux清空显存占用】Linux 系统中清理 GPU 显存
  • PostgreSQL 性能优化全方位指南:深度提升数据库效率
  • React基础知识一
  • 论文复现_How Machine Learning Is Solving the Binary Function Similarity Problem
  • 解决 Android 单元测试 No tests found for given includes:
  • golang调用webview,webview2,go-webview2
  • 【分享一个vue指令】复制指令v-copy
  • 20241121 android中树结构列表(使用recyclerView实现)
  • 设计模式:4、命令模式(双重委托)
  • Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建
  • Android Studio 设置不显示 build-tool 无法下载