zoukankan      html  css  js  c++  java
  • Java基础学习之面向对象(4)

    1.面向对象概述

    1.1.类与对象的关系

    有对象吗,没有的话我给你new一个!
    对象顾名思义就是一个个的个体,当所有的个体,例如人的总称为人类,这一类的生物或者物品。人类是对人这种个体的抽象化,不会说你是个人类,而是说你是个人,所以人就是人类的具体实现。
    简而言之,类是对象的抽象化,对象是类的具体实现。
    正所谓Java主打的万物皆对象。

    public class Person{
    	private String name;
    	private int age;
    	private String gender;
    	
    	public Person(String name, int age, String gender){
    		this.name = name;
    		this.age = age;
    		this.gender = gender;
    	}
    
    	public void say(){
    		System.out.println("hello");
    	}
    	
    	public static void main(String[] args){
    		Person p = new Person("张三", "22", "男");
    		p.say();
    	}
    }
    

    在上面代码中,类Person就是人的一种抽象化,每个人都有姓名、年龄、性别等属性和一些动作,比如说等。在main方法中我们使用关键字new将类具体化为一个对象,这个对象名张三、22岁、男性,并且说了hello。

    1.2.类的具体描述

    类Person中有属性name、age、gender等,方法say等。还有个比较特殊的方法public Person(...),这个方法就是类的构造器。
    构造方法又成为构造器,和一般的方法不同的是:

    • 没有返回值(没有返回类型,也没有void)
    • 方法名和类名一样

    一个类可以有多个构造方法,这是后面要说到的重载。

    2.面向对象的三大特性

    面向对象程序设计的优点:

    • 可扩展
    • 可重用

    缺点:

    • 复杂程度较高

    2.1.继承

    继承就是子类继承父类的特征和行为,得到父类的实例变量和方法。例如猫和狗都是动物,可以继承动物的一些通用特征和行为。
    为什么需要继承?
    如果没有继承,当我们写猫和狗的类时:

    public class Cat {
    	private String name;
    	private int age;
    	public Cat(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	public void eat() {
    		System.out.println(name+"吃东西");
    	}
    	public void sleep() {
    		System.out.println(name+"睡觉");
    	}
    }
    
    public class Dog {
    	private String name;
    	private int age;
    	public Dog(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	public void eat() {
    		System.out.println(name+"吃东西");
    	}
    	public void sleep() {
    		System.out.println(name+"睡觉");
    	}
    }
    

    发现我们写了很多重用的代码,比如属性name、age和方法eat、sleep等。
    如果使用继承代码将变成怎么样呢?

    public class Animal {
    	private String name;
    	private int age;
    	public Animal(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	public void eat() {
    		System.out.println(name+"吃东西");
    	}
    	public void sleep() {
    		System.out.println(name+"睡觉");
    	}
    }
    
    public class Cat extends Animal {
    	public Cat(String name, int age) {
    		super(name, age);
    	}
    }
    
    public class Dog extends Animal {
    	public Dog(String name, int age) {
    		super(name, age);
    	}
    }
    

    我们发现只需要写一个父类,子类就具有父类的属性和方法了,这样我们就不需要写那么多重复的代码了,提高了代码的复用性。
    总结以下:

    • 子类拥有父类的非private的属性、方法,这里private之前说过,所修饰的只能在同一个类中可见
    • 子类可以对父类进行扩展
    • 子类可以重写父类的方法
    • Java中不支持多继承

    重写和重载:

    • 重写(override):猫和鱼都继承了动物类,如果动物类有一个方法叫run(),对于猫来说使用四肢奔跑,对于鱼来说使用鱼鳍游动。这时我们需要重写父类的方法:
    public class Person {
    	public void run() {
    		System.out.println("动物跑起来了");
    	}
    }
    
    public class Cat {
    	@Override
    	public void run() {
    		System.out.println("猫跑起来了");
    	}
    }
    
    public class Fish {
    	@Override
    	public void run() {
    		System.out.println("鱼游起来了");
    	}
    }
    
    • 重载(overload):同一个类中,方法名相同,参数不同,返回值可以相同或不同。
    public class Animal {
    	public void test() {}
    	public void test(int num) {}
    	public void test(String str) {}
    	public void test(int num, String str) {}
    	public void test(String str, int num) {}
    }
    

    2.2.多态

    多态就是同一个行为具有不同的表现形式。
    多态分类:

    • 编译时多态:静态的,主要是方法的重载
    • 运行时多态:动态绑定实现的,例如父类的引用指向子类的对象

    实现多态的必要条件:

    • 继承
    • 重写
    • 向上转型:父类的引用指向子类的对象

    多态的优点:

    • 消除耦合关系
    • 可扩展性
    • 简单易用

    多态的实现方式:

    • 重写
    • 接口:可多实现接口,解决单继承的缺陷
    public interface Animal {
    	public void run();
    }
    
    public class Cat implements Animal {
    	@Override
    	public void run() {
    		System.out.println("猫趴");
    	}
    }
    
    • 抽象类和抽象方法:抽象类中可以存在非抽象方法,抽象方法一定存在于抽象类中,抽象方法只声明不实现,继承的子类必须实现抽象类中的抽象方法
    public abstract Animal {
    	public abstract void run();
    }
    
    public class Cat extends Animal {
    	@Override
    	public void run() {
    		System.out.println("猫趴");
    	}
    }
    

    2.3.封装

    封装将类的实现细节隐藏,以保证程序和数据不受外部干扰,保护信息。
    优点:

    • 保护类中的东西,隐藏信息,实现细节
    • 良好的封装可以减少耦合
    • 类内部结构可以自由修改
    • 可以精确控制类成员
    public class Person {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    将类的属性设置为private,然后对外提供public方法进行赋值和取值。

  • 相关阅读:
    高中数学常见角的范围及其表示
    立体几何习题
    常见的建系类型汇总
    双曲线
    分式不等式习题
    廓清集合中的几个问题
    二次函数
    随机变量的期望和方差
    不等式选讲习题
    JS中every()和some()的用法
  • 原文地址:https://www.cnblogs.com/liquorppp/p/13563873.html
Copyright © 2011-2022 走看看