面向对象之继承

类的封装

1.类的三要素:类名,属性和方法

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

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
//getter和setter方法...
}
复制代码

2.构造函数

概念:构造函数就是在创建对象时由JVM自动调用的函数,作用是在创建对象时给对象的成员变量赋值的;
写法:
	修饰符:构造函数只能使用访问权限修饰符修饰;如public、private等;不允许使用static关键字修饰构造函数;
	返回值类型:构造函数没有返回值类型,连void都没有;这个是区分一个函数是否是构造函数的标准;
	函数名:构造函数的函数名必须和类名一致;
	参数列表:构造函数可以重载,参数列表可以根据需要定义;
	return语句:所有Java的函数都需要通过return语句出栈,所以构造函数中也有return语句,只是因为不返回数据,所以一般不写;

构造函数的特点:
	1.如果没用重载构造函数,默认使用空参构造;
	2.如果重载了构造函数,则原来默认的空参构造将会失效;
	3.有参构造的作用,在创建对象时,为成员属性进行赋值;
	4.构造方法可以重载.
复制代码

3.this 关键字

1.不放在带有static关键字的函数中;
2.this代表调用方法时的对象的引用,即this代表本类对象;
3.this可用来区分成员变量和局部变量;
4.this(参数列表) 一般放在构造函数中有效代码的第一行,目的是给成员属性赋值;
5.this不能与super关键字同时存在.
public Person(String name, int age) {
    //this() 必须放在构造函数有效代码的第一行
    this();
    this.name = name;
    this.age = age;
}
复制代码

4.匿名对象

对象的变量名记录了该对象的引用地址.
匿名对象指的是创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量.

new Person("张三", 22).speak();//该对象的地址值没有对应的变量记录,只能用一次.

匿名对象的特点:
	1.在使用的使用直接创建,使用完毕后,该对象被回收;
	2.匿名对象只能够使用一次;
	3.匿名对象可以作为方法的返回值或者给方法传参(传参方便).

 /**
 * 函数的参数列表,里面其实都是变量;如果参数列表的数据类型是一个类名,表示接受的参数是这个类的对象;
 * @param person
 */
public static void introduce(Person person){
    System.out.println(person);
}

/**
 * 函数的返回值类型,表示这个函数要返回的数据的类型;
 * 如果一个函数的返回值类型是一个类名,表示这个函数运行结束后要返回这个类的对象;
 * @return
 */
private static Person getPerson() {
    return new Person("赵七",23);
}

a)匿名对象作为方法的返回值
	 private static Person getPerson() {
    	return new Person("赵七",23);
	}
b)匿名对象作为方法参数
	introduce(new Person("孙久",21));
复制代码

继承

1. 基本概念
在 Java 中,类的继承是指在一个现有类的基础上去构建一个新的类.构建出来的新类被称作子类,现有类被称作父类.
子类 '无条件' 拥有父类全部可继承的属性和方法.继承通过 "extends 关键字" 实现.
在 Java 中.类只支持单继承,不允许多重继承.也就是说一个类只能有一个直接父类.

基本术语:
 子类, 也称为派生类。   Derived class
 父类, 也称为基类、超类。 Super class

继承的效果: 子类继承父类,代表子类'无条件'拥有了父类一切'可继承'的成员属性和方法.
总结:子类'无条件'拥有了父类全部可继承的属性和方法.继承是类在继承,而不是对象在继承.

2.继承代码实例展示
/**
 * 基类
 */
public class Animal {
    String name;
    int age;
    private String gender;
    public void eat(){
        System.out.println(age + "岁的" + name + "正在狂吃...");
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

/**
 * 子类Dog,拥有Animal全部可继承的属性和方法
 */
class Dog extends Animal{
    public void protectHome(){
        System.out.println(age + "岁的,名叫" + name + "的正在保护家..");
    }
}

/**
 * 子类ArmyDog继承了父类Dog,拥有Dog的所有可继承的成员属性和方法
 */
class ArmyDog extends Dog{
    public void bombBlockhouse(){
        System.out.println(age + "岁的,名叫" + name + "的正在练习炸碉堡...");
    }
}

/**
 * 继承的测试代码
 */
class ExtendzDemo{
    public static void main(String[] args) {
        ArmyDog armyDog = new ArmyDog();
        armyDog.name="哮天犬";
        armyDog.age=12;
        armyDog.setGender("male");
        armyDog.eat();
        System.out.println("===================");
        armyDog.protectHome();
        System.out.println("===================");
        armyDog.bombBlockhouse();
    }
}

3.继承内存图解
复制代码

继承的注意点总结

1> 继承是类在继承,而不是对象在继承;
2> 什么时候需要使用继承 ? (is a 关系);
3> 不要为了仅仅只是得到某个类的成员而去继承.不要为了继承而继承;
   即继承强调的是: 同一个 "物种";
4> 只要有一个成员或方法不是所有子类都拥有的,那么这个成员属性和方法就不应该定义在父类之中;
5> 子类不能直接访问父类中私有的成员变量(不能继承,但是子类对象的内存中有该属性);
6> 子类一定不要拥有和父类同名的成员变量. 因为子类可以继承父类的成员变量.复制代码

转载于:https://juejin.im/post/5c2a02e56fb9a049d519976d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值