Java中的面向对象(上)
###面向对象的特点
1.封装
2.继承
3.多态
4.抽象
###类和对象
对象:具体的事物,例如法拉利,保时捷。
类:对对象的抽象,java语言最基本的单位,使用类来描述事物。例如法拉利,保时捷都属于汽车类。
先有具体的对象,然后抽象各个对象之间想象的部分,归纳出类再认识其他对象。
对象的特征–属性和方法
属性:对象具有的各种特征,每个对象的每个属性都拥有特定值,理解为事物的参数不一样。
方法:对象执行的操作,例如汽车的方法为发动,停止,加速等。
类是对象的类型,不同于int类型,具有方法;类是具有相同属性和方法的一组对象的集合
###类的定义
java中用class来描述类
1.成员变量表示就是事物的属性
2.成员发放表示就是事物的行为
格式
[访问权限修饰符] class 类名{
成员变量
成员方法
}
定义类的步骤:
1.定义类名
2.编写类的属性
3.编写类的方法
class Person{
//成员变量
String name;//姓名
int age;/年龄
String sex;//性别
//自我介绍的方法
public void introduce(){
System.out.println("名字是"+name+"年龄是"+age+"性别是"+sex);
}
}
###如何创建和使用对象
使用对象的步骤:
1.创建对象:类名 对象名 = new 类名();
Person person = new Person();
2.引用对象成员:
引用类的属性:对象名.属性
引用类的方法:对象名.方法名()
person.name = "王五";//给name属性赋值
person.introduce();//调用introduce()方法,inintroduce()方法为在类中定义的方法
###局部变量和成员变量
区别:
声明位置不同 方法中; 类中
作用范围不同 当前类的方法; 当前类
不同的方法中即使有同名的局部变量也互不影响
内存存放的位置不同 栈内存中; 堆内存中
局部变量没有默认值;成员变量有默认值
public class WorkCase02 {
public static void main(String[] args) {
student s = new student();
s.name = "小明";
s.age = 18;
s.genner = "男";
s.chineseScore = 80;
s.mathScore = 90;
s.englishScore = 60;
s.showStudent();
}
}
class student{
//成员变量
String name;
int age;
String genner;
double englishScore;
double mathScore;
double chineseScore;
public void showStudent() {
System.out.println("姓名:\t" + name + "\t性别:\t" + genner + "\t" + age + "岁");
System.out.println("总分:" + (chineseScore+mathScore+englishScore));
System.out.println("平均分:" + (chineseScore+mathScore+englishScore)/3);
}
}
###值传递和引用传递
基本数据类型作为形式参数,形参的改变不影响实际参数,传递的是值本身。
引用类型作为形式参数,形参的改变影响实际参数,传递的是地址值。
###匿名对象
匿名对象:没有名字的对象。
例如:new Person();
是对象的一种简化表示形式
匿名对象的特点
如果对象只需要使用一次,可以使用匿名对象 。
作为实际参数传递的时候比较方便。
匿名对象一旦使用完后自动释放,节约内存资源。
###封装及private关键字
封装概述:隐藏对象的属性和功能实现,仅对外提供公共访问方式。
特点:
隐藏了功能实现过程,外界只需要通过公共的访问方式访问即可。
提高了代码的复用性。
提高了程序安全性。
封装步骤
将不需要对外提供的属性和方法封装起来
属性隐藏后提供对外的访问接口
如何来对数据进行封装?
- 1.对需要封装的数据成员使用访问权限修饰符(private)加以修饰
- 2.在类的内部提供对外访问渠道 (set get方法)
- 3.使用代码对数据做数据校验 (一般省略不写,看需求实现)
class Person{
String name;
private int age;//使用private封装
String gedner;
public void showPerson() {
System.out.println(name + "," + gedner + "," + age + "岁");
}
//提供读取的方法
public int getAge(){
return age;
}
//提供外界修改内部年龄的方法
public void setAge(int age) {
this.age = age;
}
}
###继承
继承的特点:
开闭原则: 对扩展开放,对修改关闭
1.通过extends关键字,实现了继承之后,让类与类之间产生了关系,建立关系是好还是坏? 有好友坏
2.继承的本质就是抽取共性代码,多个重复代码的向上抽取,简化代码 BaseDao BaseActivity
3.类是对一批对象的抽象,继承是对一批类的抽象
4.父类又被称为超类,或者基类,子类又被称为派生类
5.Java是面向对象语言,万事万物皆是对象,为了满足这个设计原则,所有的类都直接或者间接继承自Object类
继承的好处:
1.简化了代码
2.提高了扩展性
3.提高了可维护性
继承的缺点:
高内聚,低耦合: 类与类之间,功能与功能之间,模块与模块之间,功能尽量内聚,不同模块之间,尽量独立
1.造成了耦合性过高,牵一发动全身
注意: 继承一定要慎用,主要利用继承简化代码的优点
继承的注意事项:
1.单一继承性
2.支持多层继承
3.如果父类成员使用private修饰,那么子类不能被继承
4.如果一个子类继承了父类的属性和方法还可以有自己特有的属性和方法
5.当子类和父类的成员变量重名的时候,子类优先
6.构造方法不能够被继承
什么时候使用继承?
1.一般在写代码的时候发现代码中存在重复代码,需要向上抽取,考虑继承
2.当某个类的设计非常复杂的时候可以考虑继承 例如: 设计一个窗口类
使用继承的步骤:
1.先写子类
2.观察多个子类是否存在共性代码
3.如果存在,抽取共性代码到父类中
4.子类继承父类
5.将子类共性代码删除
注意: 父类命名: A is a B
//父类
class person {
//抽取子类中的共性代码
String name;
int age;
String gender;
public void show(String name,int age,String genner) {
System.out.println("姓名:" + name +"\t年龄:" + age + "\t性别:" + gender);
}
}
//子类,使用extends关键字实现继承
class Staff extends person {
// String name;
// int age;
// String gender;
public void eat() {
System.out.println("吃");
}
public void sleep() {
System.out.println("睡");
}
}
class Student extends person {
// String name;
// int age;
// String gender;
String studentId;
String classId;
public void goSchool() {
System.out.println("上学");
}
}
class Teacher extends person {
// String name;
// int age;
// String gender;
String workId;
int teachenAge;
public void teachering() {
System.out.println("教书");
}
}
总结:类是对一批对象的抽象,继承是对一批类的抽象。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Golang中的interface是干嘛的?从面向对象中的多态与接口开始说起……
- pandas | DataFrame基础运算以及空值填充
- C++设计模式笔记(08) - Factory Method工厂方法
- 【Code】GraphSAGE 源码解析
- Kafka常见的导致重复消费原因和解决方案
- 近30个MySQL常用函数,必须推荐!
- 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文
- 用注解实现 MyBatis 开发
- MyBatis 实现数据的增删改查
- 0790-5.16.2-NameNode服务的edits不同步异常
- 0789-不停止MySQL服务重做备库的方法
- 防盗链Apache和Nginx配置对比
- Python 类特殊方法__getitem__
- 前端自动化测试探索和实践
- 我的开发日记(十四)