首页 > 编程语言 >javaSE09基础-面向对象三大特征

javaSE09基础-面向对象三大特征

时间:2022-10-28 12:32:24浏览次数:44  
标签:子类 void System public 面向对象 父类 class javaSE09 三大


面向对象特征

封装

封装概念:

  • 封装,将类的某些信息隐藏在类内部,不允许外部访问,而且时通过该类提供的方法来实现对隐藏信息的操作和访问

优点:

  1. 隐藏类的实现细节
  2. 类内部的结构可以自由的修改
  3. 可以对成员精确的控制
  4. 只能通过规定方法访问
  5. 良好的封装能够减少耦合

具体表现

  • 属性使用private权限
  • 方法使用public权限
public class Person {
private String name;
private int age;
}

nameage 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏

其构造方法,及Setter,Gestter方法.即每个值属性提供对外的公共方法访问,也就是创建一堆赋值的方法,用于访问私有属性的访问,例如:

public class EncapTest{
private String name;
private int age;

public int getAge(){
return age;
}

public String getName(){
return name;
}

public void setAge(int age){
this.age = age;
}

public void setName(String name){
this.name = name;
}
}

this 关键字是为了解决实例变量(private String name)和局部变(setName(String name)中的name变量)之间发生的同名的冲突。

测试:

public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");

System.out.print("Name : " + encap.getName()+
" Age : "+ encap.getAge());
}
}

this关键字

this关键字代表自身类的对象

  • 使用this关键字引用成员变量
  • 使用this关键字引用成员方法
    注意:this关键字必须放在非静态方法里面

使用“this.成员变量名”这样的格式来引用成员变量名,,常常硬来区分同名的成员变量呵和局部变量

继承

继承是面向对象程序设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径。

  • 继承是从已有的类中派生出新的类,新类能吸收已有类的属性和行为,并能扩展新的能力
  • Java中使用extends关键字来表示继承关系
  • java不支持多继承,一个子类只有一个父类
  • 继承后子类可以调用父类的所有非私有属性和非私有方法

使用继承

  1. 符合is-a关系的设计,使用继承
  2. 将子类共有的属性和行为放到父类中
    例如: 猫是动物, (子类)猫类的(父类)就是动物类
    继承是代码重用的一种方式

继承形式

[访问权限修饰符][修饰符]  子类名  extends  父类名{子类体}

父类(动物类)

public class Animal {
public void eat() {
System.out.println("动物吃");
}
}

子类(猫类)

public class Cat extends Animal {
public void play() {
System.out.println("猫在玩耍");
}
}

测试

public class Test {
public static void main(String[] args) {
Cat cat=new Cat();
cat.play();//子类属性
cat.eat();//父类属性
}
}

专业术语

cat类是 Animal类的子类, Animal类是cat类的父类
cat类是 Animal类的派生类, Animal类是cat类的基类

继承传递性

  • 继承后子类可以调用父类的所有非私有属性和非私有方法,并别可以多层传递,C类从B类继承,B类又从A类继承那么C类就具有B类和A类的所有非私有属性和非私有方法
  • 当一个类没有继承任何一个类时,jvm会默认让继承Object类…Object是java为所有类提供的基类

super关键字

super关键字代表父类的引用,在程序中主要途径

  • 在子类构造中调用父类的构造方法,super语句只能出现子类构造方法体的第一行
  • 用"super.成员变量名"用来引用父类成员变量
  • 用"super.方法名(参数列表)"的方式访问父类的方法.
  • 与this的区别,this通常指代当前对象,super通常指代父类.

方法的重写

重写overRide 重载overload

子类方法根据父类中继承的方法进行重写

方法重写规则:

  • 方法名相同,参数相同
  • 返回值类型相同
  • 访问权限相同
    -即于父类方法结构完全相同
    注意:构造方法不能重写

应用场景:当此父类的方法不能满足子类需求时,可以对方法进行重写(overRide)

package com.nie.day5.demo01;

public class Animal1 {
private String a;
private String eat;

public Animal1() {
super();
System.out.println("Animal无参构造");
}

public Animal1(String a) {
this.a = a;
System.out.println("Animal有参构造");
}

public void eat() {
System.out.println("动物吃");
}

public String getA() {
return a;
}

public void setA(String a) {
this.a = a;
}

public String getEat() {
return eat;
}

public void setEat(String eat) {
this.eat = eat;
}
}
package com.nie.day5.demo01;
import com.nie.day4.demo1.demo02.Animal;
public class dog extends Animal1 {

/**
* 子类构造方法,先调用父类的构造方法,默认情况下调用父类的无参构造方法
* super 调用父类任意一个构造方法
*/
public dog() {
super(); //- 用"super.成员变量名"用来引用父类成员变量
//- 用"super.方法名(参数列表)"的方式访问父类的方法.
//super("d");//super语句只能出现子类构造方法体的第一行
System.out.println("dog无参构造");
}
/**
* 重写override 重载 overload
* 方法名,参数列表相同
* 返回值类型相同
* 访问权限相同, 即父类的方法结构完全相同
* 注意:: 构造方法不能重写
*
* 场景: 父类的方法不能满足子类的时,需要对方法进行重写
*
*
*/
@Override//表示此方法有父类重写而来
public void eat(){
System.out.println("狗吃");
super.eat();
}

}

测试

public class Test {

public static void main(String[] args) {
dog a = new dog();
a.eat();
}
}
Animal有参构造
dog无参构造
狗吃
动物吃

类之间关系–关联,依赖

关联

has-a

  • 对象与对象之间的连接,.在Java中,关联关系的代码表现形式为一个类做为另外一个类的属性类型存在…类与类之间的一种最常用的关系。
  • 即“有”的关系:”has-a”。

关联关系为:关联关系的多重性

  1. 单向关联,自关联 一对一关联:一个学生,只能在一个班级里学习。
  2. 双向关联:可以调用对对方的公共属性和方法,例如知道对方的存在供货商和顾客

双向关联

publc class Customer{
//供货商对象数组作为顾客的属性成员
private Supplier [] supplier;
}
public class Supplier {
public Customer [] customer;
}

单向关联

publc class Customer{
private Address address;
}
public class Address {

}

自关联

public class Customer{
private Customer customer;
}

依赖

use a 的关系为依赖关系

  • 依赖关系(使用关系), 指一个类A使用到了另一个类B
  • 依赖关系特性
    这种关系是具有偶然性的,临时性的,非常弱的,但是类B的变化会影响到类A

课表与课程之间:

class CourseTable{
public void addCourse(Course c){
c.show();
System.out.println("新增课程");
}
pubilc void deCourse(Course c){
c.show();
System.out.println("删除课程");
}
}
class Course{
System.out.println("课程为:");
}

多态

同一事物,在不同时刻表现不同的状态

多态存在的必要的三个条件:

  • 要有继承(前提条件)
  • 要有重写(前提条件)
  • 父类引用指向子类对象
  1. 当编译类型是父类,运行类型是子类时,被称为父类引用指向子类对象
  2. 多态环境下对成员方法的调用编译看左边,运行看右边。
  3. 多态环境下对静态成员方法的调用简单的说:编译和运行都看左边。
  4. 多态环境下对成员变量的调用编译和运行都看等号左边。注意:变量不出存在被子类覆写说法,只存在覆盖

方法的形参是父类类型,而传递的似乎实际参数可以是任意子类的对象

方法参数多态性的好处:提高代码的扩展性

父类(动物类)

package com.nie.day5.demo04;

/**
* 多态
* 同一种食物,在不同时刻表现不同的状态
*
* 多态存在的三个必须的条件
* --要有继承
* --要有重写
* --父类指向子类对象
*/
public class Animal {

int num=10;
public void eat() {
System.out.println("动物吃");
}
static void show(){
System.out.println("Animal");
}

public void fly(){
System.out.println("动物飞了");
}
}

子类(猫)

package com.nie.day5.demo04;

public class Cat extends Animal {
int num = 5;

public void eat() {
System.out.println("cat 吃");
}

static void show() {
System.out.println("静态成员方法");
}
void look(){
System.out.println("看家");
}
}

子类(狗)

package com.nie.day5.demo04;

/**
* * --要有继承
* * --要有重写
*/
public class Dog extends Animal{
public void eat() {
System.out.println("小狗一号 吃");
}

}

子类(狗1)

package com.nie.day5.demo04;

public class Dog1 extends Animal {
public void eat() {
System.out.println("小狗二号 吃");
}
}

测试

package com.nie.day5.demo04;

public class Test {
public static void main(String[] args) {
//父类指向子类对象
//父类 子类
Animal a = new Cat();
/**
* 多态环境下对成员方法的调用
* **编译看左边,运行看右边。**
*/
a.eat();
/**
* 多态环境下对静态成员方法的调用
* **简单的说:编译和运行都看左边。**
*/
a.show();
/**
* a.num 编译和运行都看等号左边
* 注意:变量不存在被子类覆盖写这一说法,只有方法存在覆盖
* 调用的是父类的成员变量
*/

System.out.println(a.num);
Animal b = new Dog();
b.eat();
Animal c = new Dog1();
c.eat();
Test t = new Test();
t.method(a);
}
//方法的形参是父类类型,而传递的是实际参数可以是任意子类的对象
//提高方法参数多态性的好处:提高代码的扩展性
public void method(Animal animal) {

animal.eat();
}

}

向上转型,向下转型

父类引用指向子类对象

  • 向上转型的作用是:提高程序的扩展性。
  • 向下转型的作用是:为了使用子类中特有的方法
public class Animal {
int num=10;
void eat() {
System.out.println("动物吃");
}

}
public class Cat  extends Animal{
int num = 5;
void look(){
System.out.println("看家");
}
}
package com.nie.day5.demo05;

public class Test {//向下转型

public static void main(String[] args) {

Animal a = new Cat();//向上转型
//多态的问题:父类类型不能访问子类特有的方法
//解决办法: 向下转型
String s = "ads";
Object obj = s;
// 大类型 instanceof 小类型 判断检测大类型中是否包含的是具体的小类型
if (obj instanceof Cat) {
Cat m = (Cat) a;//向下转型
m.look();

} else {
System.out.println("不是");
}
}
}

final关键字

  • final用于声明属性,方法和类
  • 属性:定义就必须直接赋值或者在构造方法中进行赋值,并且后期不能修改
  • 方法:子类不能被覆盖
  • 类:不能被定义为抽象类或者接口,不可被继承.

final属性赋值:

–在声明时同时赋值,往往与static一起使用

final static int Num = 10;
package com.nie.day5.demo06;

public class Filal {
//用于声明方法和类
//final修饰常量,常量值不能变,利用static 修饰 节省空间
final static int Num = 10;
final int a = 100;


public final void eat() {
System.out.println("你好");
}

//定义就必须直接赋值或者在构造方法中进行中进行赋值,后期不能修改
public void num(int a) {
// this.a=1000;
System.out.println(a);
}


//在方法参数前加final关键字,防止数据在方法题中被修改.
public void num1(final int b) {
// b=11;
}
}

抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

抽象类除了不能实例化对象之外,类的其他功能依然存在,名成变量,成员方法和构造方法的访问方式和普通类一样.

用abstract修饰的类就是抽象类,如果某个类中包含抽象方法,那么这个类就必须定义抽象类.

抽象方法:

  • 抽象方法时一种特殊的方法:他只有声明,而没有具体的实现
  • 抽象方法必须用abstract关键字进行修饰

抽象类可以有成员属性和非抽象方法

抽象类不能被实例化,但可以有构造函数.因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象

抽象类不能创建对象:抽象类只能做基类,表示一种继承关系.

构造方法和静态方法不可以用abstract

[访问权限] abstract class 类名 {
成员列表
}

public abstract class Shapes {
public abstract void draw();
}

public abstract class Shapes {
public void draw(){
//具体代码
}
}

抽象类,抽象方法.


标签:子类,void,System,public,面向对象,父类,class,javaSE09,三大
From: https://blog.51cto.com/u_15850876/5804358

相关文章

  • 05面向对象编程
    对象的创建分析//面向对象编程本质:以类的方式组织代码,以对象的组织(封装)数据面向对象三大特性抽象类和接口内部类及OOP实战......
  • 面向对象的特征和原则
    面向对象中的三个基本特征:封装、继承和多态1、封装,将现实中事物抽象成计算机领域中的对象,对象同时具有属性和行为,这就是封装。在封装中,数据隐藏,对象只对外提供与其他对象交......
  • 面向对象编程
    面向对象编程以类的方式组织代码,以对象的组织(封装)数据封装、继承、多态修饰符返回值类型方法名(...){方法体返回值}方法的调用静态方法static非静态方法......
  • 选择华为云数据库,三大亮眼优势来助力
    与自建数据库相比,华为云数据库具有稳定可靠、经济实用、安全运行等特点,它为企业提供了强大的数据处理、存储和业务应用支持。2018年华为云计算进入亚太,4年后,它已跻身亚太五......
  • 软件工程第6章课后答案 面向对象需求分析
    **一、单项选择题**1.实体关系图侧重于对软件系统的()建模。功能行为质量数据[参考答案]数据2.下面关于数据流图建模规则的描述正确的是()。环境图建模的目标是分析......
  • 面向对象程序设计第二次blog
    一、前言这几次的PTA的作业以及考试涉及到的知识点由面向对象中对数据的封装、继承以及多态,还有抽象类以及对象容器也涉及到一些,与此同时还有关于正则表达式的内容。......
  • 面向对象程序设计笔记(c++)
    时间:2019/5/21学习要知其然,也要知其所以然。第一章对C的补充1.C++的输入输出2用const定义常变量3重载4引用5内置函数6作用域运算符7字符串变量8动态分配和撤消内存的运算符......
  • python实验报告(面向对象程序设计)
    实验报告实例01:通过类属性统计类的实例个数  结果:实例02:根据身高、体重计算BMI指数(共享版)  结果:   实例03:在模拟电影点播功能时应用属性  结果:......
  • 面向对象的程序设计
    1.创建大雁类并定义飞行方法classGeese:def__init__(self,beak,wing,claw):print("我是大雁类!我有以下特征:")print(beak)print(wing)......
  • C++ 面向对象高级开发(四) Sting类 浅谈
    StringClass 带指针的Class不能用默认拷贝  构造函数、拷贝构造、拷贝赋值、析构函数   浅拷贝导致内存泄漏两个指针指一个  深拷贝  ......